如何在Spring Data JPA中的HQL查询中编写左外连接

时间:2017-01-12 01:57:21

标签: hibernate jpa hql

我有一张名为“位置”的桌子,我正在捕捉员工的经纬度。位置表包含以下字段: id,employee_id(FK到员工表),纬度,经度,created_date。此表包含具有不同created_date的employee_id的许多条目。现在,从位置表我想要所有员工的条目及其最新创建日期。也就是说,位置表可能包含在1月1日和1月2日创建的employee_id 1的两个条目。生成的查询应仅返回employee_id 1的Jan 2nd条目。同样,我希望当前列在位置表中的所有员工都有条目。

在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:期望加入的路径!”

当使用相同的表进行连接时,如何给出路径?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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
)