我要创建一个按相关实体的字段排序的查询,就像这样,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版本中重现了简化示例的行为。
感谢任何帮助。
你应该使用显式连接而不是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
这就是JPA中隐式连接的定义,作为一个内部连接。因此,如果你想使用左连接语义,你将不得不使用一个显式左连接。
如果你想要一些更动态的东西,我可以推荐你看看一个查询构建器,如 燃烧-持久性 隐式连接的左连接语义。
这里是一个Spring WebMvc示例应用程序,它支持分页数据表的动态过滤和排序。https:/github.comBlazebitblaz-persistencetreemasterexamplesspring-data-webmvc。