当访问子类型的属性时,Hibernate会跳过超类型的实例

时间:2013-11-20 14:24:31

标签: java hibernate orm jpql

给出以下模型

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Super {
    private int id;
    private String general;
    //...
}

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name="ID")
public class Sub extends Super {
    private String special;
    //...
}

以下数据

+----+----------+
|  Super        |
+---------------+
| id | general  |
+---------------+
|  1 | General1 |
|  2 | General2 |
+----+----------+

+----+----------+
|  Sub          |
+---------------+
| id | special  |
+---------------+
|  2 | Special2 |
+----+----------+

使用Hibernate 3.6.5,我想实现以下目标:

返回Sub.special(如果可用),否则返回Super.general。

所以我写了

SELECT 
  s.id,
  CASE TYPE(s)
    WHEN Sub THEN s.special
    ELSE s.general
  END
FROM Super s

我的预期结果是

+---------------+
|  1 | General1 |
|  2 | Special2 |
+----+----------+

但实际返回的只是

+---------------+
|  2 | Special2 |
+----+----------+

因此超类型的实例不包含在结果中。 显然,这是因为子类的属性在SELECT子句中的某处使用。

任何想法,如何在不使用子查询或外连接的情况下获得上述预期结果?

EDIT3 /澄清:

当使用CASE TYPE并选择未绑定到子类型的东西时,一切都完美无缺。

SELECT 
  s.id,
  CASE TYPE(s)
    WHEN Sub THEN  'Hooray, I'm a sub-instance'
    ELSE 'Shoot, I'm no sub-instance'
  END
FROM Super s 

导致

+----------------+
|  1 | Shoot...  |
|  2 | Hooray... |
+----+-----------+

我不需要静态文本,而是需要子类属性的值。

  • EDIT1:将@Inheritance添加到超级和子类。
  • EDIT2:添加了@PrimaryKeyJoinColumn
  • EDIT3:添加了不使用子类属性的SELECT,s.t。两个元组都返回。

1 个答案:

答案 0 :(得分:0)

如果希望使用hibernate继承映射,则应定义

Mapping strategies

有3种继承策略

您应该添加@Inheritance注释,并根据您的需求和数据库结构选择上面的继承策略之一。

另见

Entity inheritance

Hibernate inheritance mapping