HQL 查询以检查集合的大小是不是为 0 或为空
Posted
技术标签:
【中文标题】HQL 查询以检查集合的大小是不是为 0 或为空【英文标题】:HQL Query to check if size of collection is 0 or emptyHQL 查询以检查集合的大小是否为 0 或为空 【发布时间】:2011-04-15 05:07:14 【问题描述】:我尝试生成一个 HQL 查询,其中包含具有空约会集合的用户(由 OneToMany 映射):
SELECT u FROM User u JOIN u.appointments uas WHERE u.status = 1 AND (uas.time.end < :date OR size(uas) = 0)
我尝试了几种方式 (NOT EXIST ELEMENT(), IS NULL
)
另请参阅:How to check if the collection is empty in NHibernate (HQL)?(这对我不起作用)
但仍然不是我想看到的结果或 HQL 或 SQL SERVER 中的一些错误
注意:
没有 JOIN 的查询有效:
"FROM User u WHERE u.status = 1 AND size(u.appointments) = 0"
已解决
另一个 JOIN 解决了这个问题:
SELECT u FROM User u LEFT JOIN u.appointments pas1 LEFT JOIN pas1.slot t WHERE u.status = 1 AND t.end <= :date1 OR t.end IS NULL ORDER BY u.name asc
【问题讨论】:
【参考方案1】:使用 IS EMPTY
应该可以工作(我更喜欢 JPQL 语法):
SELECT u FROM User u WHERE u.status = 1 AND u.appointments IS EMPTY
如果没有,请显示生成的 SQL。
参考文献
Hibernate 核心参考指南 14.10. Expressions JPA 1.0 规范 第 4.6.11 节“空集合比较表达式”【讨论】:
不幸的是'“从用户 u 加入 u.appointments uas WHERE u.status = 1 AND uas 为空”'不起作用。它没有给我任何用户。而且还有很多用户没有预约 mm 你的建议有效,但我需要加入。我正在寻找使用大小或为空结合Join的方法,谢谢您的支持 @michel 为什么需要加入?您使用 JOIN 的查询只会返回在连接条件中具有匹配值的用户(即用户 with 约会)。 @Pascal 我需要它,因为我需要所有预约时间不超过 10 天且没有预约的用户 @michel 你可能需要一个左连接,而不是一个内连接。您当前的查询(没有约会大小的条件)没有按照您的意愿进行。【参考方案2】:您查看过生成的 SQL 吗?你的方法在这里很好用:
// Hibernate query:
const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";
// Generates this working SQL:
select user0_.Id as Id20_,
user0_.Name as Name2_20_
from User user0_
where user0_.Id = 101
and (select count(appointment1_.Id_Solicitud)
from Appointment appointment1_
where user0_.Id = appointment1_.Id_User) = 0
【讨论】:
【参考方案3】:// Hibernate query:
const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";
【讨论】:
稍微解释一下会让你的答案更好。 :) size() = 0 对我有用,不支持 IS Empty。谢谢!【参考方案4】:以下查询将起作用。诀窍是使用左连接。
SELECT u FROM User u LEFT JOIN u.appointments uas
WHERE u.status = 1 AND
(uas.time.end < :date OR size(u.appointments) = 0)
【讨论】:
以上是关于HQL 查询以检查集合的大小是不是为 0 或为空的主要内容,如果未能解决你的问题,请参考以下文章