我有两个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.
解决方法
啊,这确实是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)