java - 当访问子类型的属性时,Hibernate 会跳过父类(super class)型的实例

标签 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 |
+----+----------+

因此父类(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注解,并根据您的需求和数据库结构选择上述继承策略之一。

另请参阅

Entity inheritance

Hibernate inheritance mapping

关于java - 当访问子类型的属性时,Hibernate 会跳过父类(super class)型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098496/

相关文章:

javascript - Waterline/SailsJs 防止模型的嵌套(关系)保存

java - 更改应用程序背景

java - Hibernate 教程 - 在哪里放置映射文件?

java - 如何在每个线程完成 Java 运行后运行任务?

php - 模型中的 Kohana ORM 自定义方法

python - Django - 条件外键

java - 具有运行时确定的构造函数参数的部分 Autowiring Spring 原型(prototype) bean

Spring Data查询执行优化: Parallel Execution of Hibernate @Query Method in JpaRepository

java - Hibernate get() 总是返回 NULL

java - Spring 数据JPA : extend a JPA Query generically