如果引用对象为NULL,如何使用HQL获取空值来引用对象id

时间:2012-09-27 06:02:59

标签: hibernate hql

我的HQL选择查询如下所示

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

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

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

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

4 个答案:

答案 0 :(得分:3)

今天面临类似的问题。 这里的问题是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

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

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

答案 1 :(得分:2)

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

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

select子句中的case case子句就像if else

一样
if (user.address == null)
   return "";
else
   return user.address.id;
通过这种方式,您将获得所有记录。

答案 2 :(得分:0)

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

可以阅读here

  

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

     

所以你想要的东西是:

     表中的

,其中col1 = coalesce(:par1,'asdf')

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

  

从用户用户

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

答案 3 :(得分:0)

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

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

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

现在你可以拥有它,以获得其余的记录:

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