1

如何在 HQL 中替换(或使用空值获取结果)空值?在我的情况下,SomeObject可以为空。Clazz我在和之间有多对一的关系SomeObject

SELECT c.name, c.someObject.name from Clazz c

我试过了:

SELECT c.name, coalesce(c.someObject.name, ' ') from Clazz c 

但它不返回任何行。

4

2 回答 2

2

您可能要注意,没有“多对空”关系之类的东西。如果引用的对象 ( SomeObject) 是null在持久化Clazz实体时,则不会SomeObject数据库表中创建条目。

然后,当您尝试访问SomeObject查询中的(不存在的)(c.someObject.name)时,Hibernate 将隐式构建一个内部连接,这当然会排除有Clazz问题的对象,因为无法完成连接。

尝试显式使用外连接;这将解决您的问题。

顺便说一句:您可以让 hibernate输出它生成的 SQL 语句,这样可以更好地理解给定查询以某种方式运行的原因。

于 2012-12-17T20:14:16.630 回答
0

c.someObject.name是 Clazz 和 SomeObject 之间的隐式内部连接。因此,由于它是一个内连接,它会自动过滤掉具有nullsomeObject 的 Clazz 实例。

你需要一个外连接:

select c.name, s.name from Clazz c
left join c.someObject s
于 2012-12-17T20:14:25.003 回答