给出以下模型
@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... |
+----+-----------+
我不需要静态文本,而是需要子类属性的值。
答案 0 :(得分:0)
有3种继承策略
您应该添加@Inheritance
注释,并根据您的需求和数据库结构选择上面的继承策略之一。
另见