我有两个JPA实体:
我的目标是在检索所有计划时仅检索与日期参数(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为空”部分)
长答案:明确地说这对休眠/ JPA人员不起作用,但确实如此。生成的SQL也非常有效。如果有人能解释为什么这样做有效,那么我将印象深刻。我几年前就学会了这种模式,但我一生都记不清在哪里。
一注:有一个情况下,这将无法工作,这是在目前还没有预订此调度的实例。在这种情况下,我唯一能提供的答案是,您可以将查询包装在“ NoResultException”的try / catch中,然后再次查询而不带where子句(显然,如果没有保留,则没有保留带有resDate的保留。 planningDate)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句