Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算两个坐标之间的距离SQL+标准生成器_Java_Sql_Hibernate_Jpa - Fatal编程技术网

Java 计算两个坐标之间的距离SQL+标准生成器

Java 计算两个坐标之间的距离SQL+标准生成器,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,所以在我的代码中,我希望能够用一些参考坐标检查范围内的坐标。 开始时,我使用了一些本机SQL查询,如: @Query( value = "SELECT * FROM event " + " inner join event_location location on location.id = event.location_id\n" + " wh

所以在我的代码中,我希望能够用一些参考坐标检查范围内的坐标。 开始时,我使用了一些本机SQL查询,如:

  @Query(
          value = "SELECT * FROM event " +
                  "   inner join event_location location on location.id = event.location_id\n" +
                  "  where Round( ST_Distance_Sphere(\n" +
                  "    Point(?1 , ?2 )," +
                  "    Point(location.longtitude , location.latitude ), 4326), 2) <= ?3",
          nativeQuery = true)
  List<Event> findAllEventsInRange(double longtitude, double latitude, String range);
它工作得很好,但现在我想使用规范和标准生成器。 老实说,我不知道如何在where关键字之后写出条件

有人能告诉我怎么做吗

编辑: 实体被定义。我已经创建了规范,用于连接两个表-事件和事件位置:

public static Specification<Event> filter(Search search){
return (root, cq, cb) -> {
      Predicate location = null;

      List<Predicate> result = new ArrayList<>();

      if(search.getLat() != null && search.getLng() != null && search.getRange() != null) {
         Join<Event,EventLocation> join = root.join("eventLocation", JoinType.LEFT);
            }

            return cb.and(result.toArray(new Predicate[result.size()]));
        };
    }

现在我需要创建一个适当的谓词,它将在WHERE之后执行与语句相同的操作。我知道criteria builder上有一个函数可用于某些本机sql函数,但我不确定如何在我的示例中使用它,以及如何与其他不同的sql函数组合使用。

对此,您需要使用通用函数调用语法,它类似于以下内容:

public static Specification<Event> filter(Search search){
    return (root, cq, cb) -> {
      Predicate location = null;

      List<Predicate> result = new ArrayList<>();

      if(search.getLat() != null && search.getLng() != null && search.getRange() != null) {
         Join<Event,EventLocation> join = root.join("eventLocation", JoinType.LEFT);
         result.add(
           cb.le(
             cb.function("Round", String.class,
               cb.function("ST_Distance_Sphere", String.class, 
                 cb.function("Point", String.class, 
                   cb.literal(search.getLat()),
                   cb.literal(search.getLng())
                 ),
                 cb.function("Point", String.class, 
                   join.get("longtitude"),
                   join.get("latitude ")
                 ),
                 cb.literal(4326)
               ),
               cb.literal(2)
             ),
             cb.literal(search.getRange())
           )
         );
      }
  
      return cb.and(result.toArray(new Predicate[result.size()]));
   };
}

我猜想,您没有为表定义实体。这将是第一步。在那之后,我个人会尝试摆脱nativeQuery=true。在这种情况下,现代开发工具可以帮助您确保JQL查询在语法上是正确的。在我看来,标准构建器不是直观的。你在字体安全性方面可能获得的东西,你在清晰度方面就失去了。