我的 JPA 应用程序中有一个 SQL nativQuery,如下所示:
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))) <= ? ))));
此查询为我提供了距离分配位置一定距离的申请分配的用户。它工作得很好,但我想得到到的距离,这就是我的问题 - 我不知道如何在查询结束时提取距离函数的结果。
我是 SQL 和 JPA 新手,所以我的问题很可能很容易解决,但我自己无法解决。
提前感谢您的帮助:)
最佳答案
所以我花了几个小时,喝了啤酒,但我明白了:)现在我的查询看起来像:
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,我可以访问连接表中的所有数据,并且新查询的速度比嵌套 IN 的瀑布要快得多。 ;0 希望它能帮助别人
关于mysql - SQL JPA 原生查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21333211/