java – 如何将LEFT JOIN和Where子句与JPQL组合?

前端之家收集整理的这篇文章主要介绍了java – 如何将LEFT JOIN和Where子句与JPQL组合?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个JPA实体:

>附表(包含预约清单)
>预约(包含日期字段:日期resDate)

我的目标是仅在检索所有时间表时检索与日期参数(planningDate)匹配,无论在此给定日期是否存在保留.

所以我写道:

SELECT s FROM Schedule as s LEFT JOIN s.reservations as r WHERE r.resDate = :planningDate order by s.startHour

为什么在这个日期没有预订的时间表,尽管我的LEFT JOIN?

可能,像本地查询一样,当与WHERE子句组合时,LEFT JOIN看起来像INNER JOIN.

那么,如何更改查询来满足我的要求?我没有在JPQL中找到一个特定的功能.

解决方法

啊,这确实是JPA的经典.
以下答案我提供 – 我无法解释为什么它的作品,但我可以解决这个为你

简短的答案,试试:

SELECT s FROM Schedule as s LEFT JOIN s.reservations as r WHERE 
(r.resDate is null or r.resDate = :planningDate) order by s.startHour

(这里的关键是“r.resDate为null”部分)

长答案:
这被明确地表示不由hibernate / JPA人员工作,但它确实.生成sql也是非常有效的.如果有人可以解释为什么这个工作,我会印象最深刻的.我几年前就学到了这种模式,但是不能为了我的生活记住哪里.

一个注意事项:有一种情况不能正常工作,而在这种情况下,这个时间表没有任何保留.在这种情况下,我可以提供的唯一答案是可以将您的查询包装在“NoResultException”的try / catch中,并且在没有where子句的情况下重新查询(显然,如果没有保留,则在resDate上不存在任何保留planningDate)

猜你在找的Java相关文章