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 或为空的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中检查 NSArray 是不是为空或为空?

如何判断一个集合是不是是集合的真子集?

HQL:一个集合的元素是不是在另一个集合中?

hibernate hql语句怎么在查询时区分大小写?

Hibernate HQL 查询:如何将集合设置为查询的命名参数?

如何检查数据读取器是不是为空或为空