给定以下模型
@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 |
+----+----------+
因此父类(super class)型的实例不包含在结果中。 显然,这是因为在 SELECT 子句中的某处使用了子类型的属性。
有什么想法吗,如何在不使用子查询或外连接的情况下获得上述预期结果?
编辑3/澄清:
当使用 CASE TYPE 并选择未绑定(bind)到子类型的内容时,一切正常。
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... |
+----+-----------+
我不需要静态文本,而是需要子类属性的值。
- 编辑1:向父类(super class)和子类添加了@Inheritance。
- 编辑2:添加了@PrimaryKeyJoinColumn
- EDIT3:添加了不使用子类属性的 SELECT,s.t。两个元组都被返回。
最佳答案
如果要使用hibernate继承映射,应该定义映射策略。
有3种继承策略
- 每个具体类策略的表格
- 联合子类策略
- 单表策略
您应该添加@Inheritance
注解,并根据您的需求和数据库结构选择上述继承策略之一。
另请参阅
关于java - 当访问子类型的属性时,Hibernate 会跳过父类(super class)型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098496/