JPQL-查询中的'ORDER BY'在生成的sql中添加了'CROSS JOIN',从而减少了最终结果。

问题描述 投票:0回答:1

我要创建一个按相关实体的字段排序的查询,就像这样,Hibernate基于JPQL建立的sql-query使用了CROSS JOIN的条件(实际上是内联接)。

SELECT p FROM Patient p ORDER BY p.doctor.name

而Hibernate基于JPQL建立的SQL查询使用了CROSS JOIN条件(有效的内部连接)。

select patient0_.id as id1_1_, patient0_.doctor_id as doctor_i3_1_, patient0_.name as name2_1_
from patient patient0_ cross join doctor doctor1_
where patient0_.doctor_id=doctor1_.id
order by doctor1_.name

副作用是,所有在 "医生 "字段中为空的病人都会被排除在结果集之外。在这种情况下,我是否可以切换到提示Hibernate使用LEFT JOIN的选项?这样的行为难道不能算是一个bug吗?从常识上来说,仅仅是增加排序不会影响结果数。

这个例子是故意简化的。在现实世界中,它是一个动态建立的标准查询,具有可变的过滤器和排序集。所以我不能绕过它,在JPQL中使用显式LEFT JOIN。

我在5.3.9.Final版本和最新的5.4.15.Final版本中重现了简化示例的行为。

感谢任何帮助。

java hibernate jpa orm jpql
1个回答
1
投票

你应该使用显式连接而不是hibernate隐式连接。

SELECT p FROM Patient p left join fetch p.doctor d ORDER BY d.name

如果有 懒惰关系 而且它不想要那个医生被装。取来 不应该被使用。

SELECT p FROM Patient p left join p.doctor d ORDER BY d.name

0
投票

这就是JPA中隐式连接的定义,作为一个内部连接。因此,如果你想使用左连接语义,你将不得不使用一个显式左连接。

如果你想要一些更动态的东西,我可以推荐你看看一个查询构建器,如 燃烧-持久性 隐式连接的左连接语义。

这里是一个Spring WebMvc示例应用程序,它支持分页数据表的动态过滤和排序。https:/github.comBlazebitblaz-persistencetreemasterexamplesspring-data-webmvc。

© www.soinside.com 2019 - 2024. All rights reserved.