JPQL-query中的"ORDER BY"将"CROSS JOIN"添加到生成的SQL中,从而减少最终结果



我要创建按相关实体字段排序的查询,如下所示:

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

Hibernate基于JPQL构建的sql-query使用带有条件的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

作为副作用,所有在"医生"字段中为空的患者都被排除在结果集中。在这种情况下,有什么选项可以切换到提示休眠以使用左加入吗?这样的行为不能被视为错误吗?从常识的角度来看,仅添加排序不会影响结果计数。

示例是有意简化的。在现实世界中,它是一个动态构建的标准查询,具有一组可变的过滤器和排序。所以我不能解决它并在 JPQL 中使用显式左连接。

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

感谢任何帮助。

您应该使用显式联接而不是休眠隐式联接。

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

如果存在惰性关系并且不希望加载医生,则不应使用fetch

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

这就是为 JPA 定义隐式连接的方式,即内部连接。因此,如果要使用左连接语义,则必须使用显式左连接。

如果你想要一些更动态的东西,我可以建议你看看像Blaze-Persistence这样的查询构建器,它为隐式连接留下了连接语义。

下面是一个Spring WebMvc示例应用程序,它支持对分页数据表进行动态过滤和排序: https://github.com/Blazebit/blaze-persistence/tree/master/examples/spring-data-webmvc

最新更新