加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:17:37 所属栏目:Java 来源:网络整理
导读:我有两个JPA实体: 附表(包含预约清单) 预约(包含日期字段:日期resDate) 我的目标是仅在检索所有时间表时检索与日期参数(planningDate)匹配,无论在此给定日期是否存在保留. 所以我写道: SELECT s FROM Schedule as s LEFT JOIN s.reservations as r WHERE
我有两个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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读