2014-01-24 38 views
0

我有一個SQL nativQuery在我的JPA的應用程序,這看起來像:SQL JPA nativeQuery

SELECT 
    DISTINCT user0_.USER_ID, 
    user0_.FIRSTNAME, 
    user0_.LASTNAME 
FROM USERS user0_ 
WHERE user0_.USER_ID 
     IN 
     (SELECT 
     app1_.user_id 
     FROM applications app1_ 
     WHERE app1_.PROJECT_LOCATION_ID IN 
      (SELECT 
       pl3_.PROJECT_LOCATION_ID 
       FROM project_locations pl3_ 
       WHERE pl3_.location_id IN 
        (SELECT 
         loco4_.LOCATION_ID 
        FROM locations loco4_ 
        WHERE 
         ((6371 * 
         SQRT(POWER(RADIANS(loco4_.LATITUDE) - RADIANS(?), 2) 
           + POWER(
          (RADIANS(loco4_.LONGITUDE) - RADIANS(?)) * 
          (COS((RADIANS(loco4_.LATITUDE) + RADIANS(?))/2)), 2))) <= ?)))); 

此查詢得到我,applicated來分配在一定的距離從分配位置的用戶。它工作得很好,但我想獲得距離,這就是我的問題 - 我不知道如何在查詢結束時提取距離函數的結果。

我是新來的SQL和JPA所以propably我的問題很容易解決,但我不能自己想象它。

預先感謝幫助:)

回答

0

所以我花了幾個小時,而啤酒在這一個,但我得到了它:)現在我的查詢是這樣的:

SELECT 
    DISTINCT USR2.user_id, USR2.firstname, USR2.lastname, USR2.username, USD2.phone, 
    min(6371 * 
    SQRT(POWER(RADIANS(LOC2.LATITUDE) - RADIANS(LOC1.LATITUDE), 2) 
     + POWER(
     (RADIANS(LOC2.LONGITUDE) - RADIANS(LOC1.LONGITUDE)) * 
     (COS((RADIANS(LOC2.LATITUDE) + RADIANS(LOC1.LATITUDE))/2)), 2))) AS distance, 
    GROUP_CONCAT(NO2.note) AS notes, 
    max(APP2.CREATE_DATE) as last_user_app 
FROM 
    project_locations PRL1 
    JOIN locations LOC1 ON PRL1.LOCATION_ID = LOC1.LOCATION_ID 
    JOIN locations LOC2 
    ON (6371 * 
     SQRT(POWER(RADIANS(LOC2.LATITUDE) - RADIANS(LOC1.LATITUDE), 2) 
      + POWER(
      (RADIANS(LOC2.LONGITUDE) - RADIANS(LOC1.LONGITUDE)) * 
      (COS((RADIANS(LOC2.LATITUDE) + RADIANS(LOC1.LATITUDE))/2)), 2))) <= 22 
    JOIN project_locations PRL2 ON PRL2.LOCATION_ID = LOC2.LOCATION_ID 
    JOIN applications APP2 ON APP2.PROJECT_LOCATION_ID = PRL2.PROJECT_LOCATION_ID 
    JOIN users USR2 ON USR2.user_id = APP2.user_id AND USR2.active = 1 
    JOIN user_details USD2 ON USD2.USER_ID = USR2.USER_ID 
    LEFT JOIN notes NO2 ON NO2.USER_ID = USR2.USER_ID 
WHERE 
    PRL1.PROJECT_LOCATION_ID = 46 
GROUP BY USR2.user_id 

使用JOIN代替在我可以訪問連接表中的所有數據,並且新查詢的速度比嵌套IN的瀑布好得多。 ; 0 希望它能幫助別人