我的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,''] ......
答案 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