gpt4 book ai didi

java - 如何将 LEFT JOIN 和 Where 子句与 JPQL 结合使用?

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:26 25 4
gpt4 key购买 nike

我有两个 JPA 实体:

  • 日程表(包含预订 list )
  • 预订(包含日期字段:Date resDate)

我的目标是仅检索与日期参数 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com