我的 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,'']...
今天遇到了类似的问题。这里的问题是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
找到了这些东西的确切答案。
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;
这样,您将获得所有记录。
如果这是唯一的情况,您可以执行以下操作:
select user.id, user.address.id from User user
user.address
当不为空时,这将为您提供所有记录。
您现在可以拥有这个,以拥有其余的记录:
select user.id, '' from User user when user.addresss is null
您可以使用“coalesce”命令(如“nvl”SQL 命令)。
可以在这里阅读:
与 HQL 中的 nvl 命令等效的是 coalesce 命令。如果 a 不为空,则 coalesce(a,b) 将返回 a,否则返回 b。
因此,您需要以下内容:
从表 col1 = coalesce(:par1, 'asdf')
编辑:在你的情况下,我假设你正在寻找类似的东西:
从用户用户中选择 user.id, coalesce(user.address.id, '')