【问题标题】:how to get empty value using HQL for refering object id if refering object is NULL如果引用对象为 NULL,如何使用 HQL 获取空值来引用对象 id
【发布时间】:2012-09-18 20:41:58
【问题描述】:

我的 HQL 选择查询如下所示

     select user.id, user.address.id from User user

在此查询中,如果 user.addressNULL,则查询不会返回该用户记录。

我的要求是,如果 user.address 为 NULL,则 user.address.id 应返回所有带有 ''(空值)的用户记录,用于 user.address.id。 记录应如下所示

[1,''], [2,1], [3,'']...

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    您可以使用“coalesce”命令(如“nvl”SQL 命令)。

    可以阅读here:

    与 HQL 中的 nvl 命令等效的是 coalesce 命令。如果 a 不为 null,则 coalesce(a,b) 将返回 a,否则返回 b。

    所以你会想要以下内容:

    从表 where col1 = coalesce(:par1, 'asdf')

    编辑: 在你的情况下,我假设你正在寻找类似的东西:

    从用户用户中选择 user.id, coalesce(user.address.id, '')

    【讨论】:

    • 如果 user.address 为 NULL 那么它不返回用户记录。 :(
    【解决方案2】:

    如果这是唯一的情况,您可以这样做:

    select user.id, user.address.id from User user
    

    user.address 不为空时,这将为您提供所有记录。

    您现在可以拥有这个,以拥有其余的记录:

    select user.id, '' from User user when user.addresss is null
    

    【讨论】:

    • 进行两次查询并不总是一个自然的选择,例如如果有多个这样的字段有问题(user.address.id、user.contact.mobile、user.preferences.private 等)
    【解决方案3】:

    找到了这些东西的确切答案。

    select user.id, case when user.address is null then '' else user.address.id end 
    from User user
    

    select 子句中的 case 子句与 if else 类似

    if (user.address == null)
       return "";
    else
       return user.address.id;
    

    这样你会得到所有的记录。

    【讨论】:

      【解决方案4】:

      今天遇到了类似的问题。 这里的问题是hibernate会产生inner join address SQL。

      select user0_.id as col_0_0_, address1_.id as col_1_0_ from user user0_
          inner join address address1_ on user0_.address_id=address1_.id
      

      作为内部连接的结果,您将丢失所有地址为空的记录。使用显式左连接来实现您所需要的。总部:

      select user.id, addr.id from User user left join user.address addr
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-10
        • 2016-11-28
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        相关资源
        最近更新 更多