【问题标题】:Hibernate, replace null value in hql休眠,替换hql中的空值
【发布时间】:2012-12-17 19:31:50
【问题描述】:

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

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

我试过了:

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

但它不返回任何行。

【问题讨论】:

  • 'many'-side 是Clazz,'one'-side 是SomeObject,它的值可以为null

标签: java hibernate null hql


【解决方案1】:

您可能要注意,不存在“多对空”关系。如果引用的对象 (SomeObject) 是 null,则在持久化 Clazz 实体时,no 条目将被添加到 SomeObject 数据库表中。

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

尝试显式使用outer join;这将解决您的问题。

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

【讨论】:

    【解决方案2】:

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

    你需要一个外连接:

    select c.name, s.name from Clazz c
    left join c.someObject s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-14
      • 2019-07-16
      • 2013-12-27
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多