作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个 JPA 实体:
我的目标是仅检索与日期参数 (planningDate) 匹配的预订,同时检索所有计划,无论该给定日期是否存在预订。
所以我写道:
SELECT s FROM Schedule as s LEFT JOIN s.reservations as r WHERE r.resDate = :planningDate order by s.startHour
尽管我使用了 LEFT JOIN,为什么没有检索到该日期没有预订的时间表?
可能与 native 查询一样,LEFT JOIN 在与 WHERE 子句组合时看起来像 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 is null”部分)
长答案:hibernate/JPA 人员明确表示这不起作用,但确实如此。生成的 SQL 也相当高效。如果有人能解释为什么这样做,我会印象最深。我几年前就学会了这种模式,但我终生不记得在哪里。
请注意:在一种情况下这将不 起作用,即在没有对该计划进行预订的情况下。在这种情况下,我能提供的唯一答案是您可以将查询包装在“NoResultException”的 try/catch 中,然后在没有 where 子句的情况下再次查询(显然,如果没有保留,则没有保留 resDate on计划日期)
关于java - 如何将 LEFT JOIN 和 Where 子句与 JPQL 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270060/
我是一名优秀的程序员,十分优秀!