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)

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...