2

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

4

4 回答 4

3

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

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
于 2013-10-24T13:30:59.570 回答
2

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

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;

这样,您将获得所有记录。

于 2012-09-27T09:45:01.723 回答
0

如果这是唯一的情况,您可以执行以下操作:

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

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

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

select user.id, '' from User user when user.addresss is null
于 2012-09-27T07:03:06.390 回答
0

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

可以在这里阅读:

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

因此,您需要以下内容:

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

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

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

于 2012-09-27T06:09:33.387 回答