【问题标题】:How to write left outer joins in HQL query in Spring Data JPA如何在 Spring Data JPA 中的 HQL 查询中编写左外连接
【发布时间】:2017-01-12 01:57:21
【问题描述】:

我有一个名为“位置”的表,用于记录员工的纬度和经度。位置表具有以下字段: id、employee_id(FK 到员工表)、纬度、经度、created_date。此表包含许多具有不同 created_date 的employee_id 条目。现在,从位置表中,我想要所有员工的最新创建日期的条目。也就是说,位置表可能包含在 1 月 1 日和 1 月 2 日创建的employee_id 1 的两个条目。结果查询应该只返回员工 ID 1 的 1 月 2 日条目。同样,我想要位置表中当前列出的所有员工的条目。

MySQL 中的以下查询是这样做的:

SELECT loc1.* FROM location loc1 LEFT OUTER JOIN location loc2 
    ON (loc1.employee_id = loc2.employee_id AND 
        (loc2.createdDate > loc1.created_date AND loc2.id > loc1.id)) 
    where loc2.employee_id is null;

现在,当我在 Spring Data JPA 中运行与 HQL 查询相同的查询时,查询变为:

SELECT loc1 FROM location loc1 LEFT OUTER JOIN location loc2 ON 
        (loc1.employee= loc2.employee AND 
               (loc2.createdDate > loc1.createdDate AND loc2.id > loc1.id)) 
        where loc2.employee is null

我明白了

“由:org.hibernate.hql.internal.ast.QuerySyntaxException 引起:连接需要路径!”

同一张表用于join时如何给出路径?

【问题讨论】:

    标签: hibernate jpa hql


    【解决方案1】:

    如果实体之间定义了 JPA 关系,请参阅How to perform left join in Hibernate Query Language?

    否则请参阅HQL left join of un-related entities

    【讨论】:

      【解决方案2】:

      我认为您可以使用EXISTS 子句而不是LEFT JOIN 重写您的HQL 查询,如下所示:

      SELECT loc1 FROM location loc1
      WHERE NOT EXISTS(
          SELECT 'NEXT'
          FROM location loc2
          WHERE loc2.employee = loc1.employee
          AND loc2.createdDate > loc1.createdDate AND loc2.id <> loc1.id
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        • 2016-06-14
        • 2017-05-13
        相关资源
        最近更新 更多