【问题标题】: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

【问题讨论】:

    标签: sql hibernate hql


    【解决方案1】:

    使用 IS EMPTY 应该可以工作(我更喜欢 JPQL 语法):

    SELECT u FROM User u WHERE u.status = 1 AND u.appointments IS EMPTY
    

    如果没有,请显示生成的 SQL。

    参考文献

    • Hibernate 核心参考指南
    • 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)
      

      【讨论】:

        猜你喜欢
        • 2010-11-09
        • 2018-12-24
        • 2011-04-24
        • 2013-06-19
        • 2016-06-20
        • 1970-01-01
        • 2017-05-28
        • 2020-08-27
        • 1970-01-01
        相关资源
        最近更新 更多