mysql - SQL JPA 原生查询

标签 mysql sql jpa

我的 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/

相关文章:

.net - 检索所有子项及其子项,递归 SQL

sql - 给定纬度/经度的基于距离的 JOIN

jpa - 如何在JPA中保留Entity类型的数组列表

java - hibernate 中的 save() 和 persists() 方法在级联方面有什么区别?

mysql - 使用 Min(ID) 删除同义词对

MySQL,计算表中每个字段的值

php - 在 laravel 中更新一组行的最佳方法是什么

mysql - SQL JOIN 自表

php文件路径/文件扩展名未保存到sql中的数据库

java - 如何从数据库生成对象@Entities?