簡體   English   中英

計算兩個坐標之間的距離 SQL + Criteria Builder

[英]calculating distance between two coordinates SQL + Criteria Builder

所以在我的代碼中,我希望能夠使用一些參考坐標檢查哪些坐標在范圍內。 一開始我使用的是一些本機 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 之后的語句執行相同的操作。 I know there is function on criteria builder which can be used for some native sql function but not sure how i can use it in my case and combine with different other sql functions as well.

為此,您需要使用通用的 function 調用語法,如下所示:

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()]));
   };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM