java - Hibernate:通过继承类的属性查询对象

标签 java hibernate orm

我在使用 Hibernate 时遇到了一个问题,涉及对使用继承的类的查询。基本上我有以下类层次结构:

@Entity 
@Table( name = "recording" ) 
class Recording 
{    
  ClassA attributeSet;
  ...
}

@Entity
@Inheritance( strategy = InheritanceType.JOINED )
@Table( name = "classA" )
public class ClassA
{
  String Id;
  ...
}

@Entity
@Table( name = "ClassB1" )
@PrimaryKeyJoinColumn( name = "Id" )
public class ClassB1 extends ClassA
{
  private Double P1300;
  private Double P2000;
}

@Entity
@Table( name = "ClassB2" )
@PrimaryKeyJoinColumn( name = "Id" )
public class ClassB2 extends ClassA
{
  private Double P1300;
  private Double P3000;
}

层次结构已经这样给定了,我不能轻易改变它。如您所见,ClassB1 和 ClassB2 继承自 ClassA。这两个类都包含一组属性,有时甚至具有相同的名称(但我不能将它们移至 ClassA,因为可能有更多不使用它们的子类)。 Recording 类引用此类之一的一个实例。

现在我的问题是: 我想要做的是选择我的数据库中的所有 Recording 对象,这些对象引用 ClassB1 或 ClassB2 的实例,例如字段 P1300 == 15.5(所以这可能是 ClassB1 或 ClassB2 实例,因为 P1300 属性在两个类中都声明了)。

我试过的是这样的:

Criteria criteria = session.createCriteria(Recording.class);
criteria.add( Restrictions.eq( "attributeSet.P1300", new Double(15.5) ) );
criteria.list();

但是由于 P1300 不是 ClassA 的属性,hibernate 抛出异常告诉我:

could not resolve property: P1300 of: ClassA

我如何告诉 hibernate 它应该在所有子类中搜索以找到我要过滤的属性?

谢谢 MichaelD

最佳答案

由于属性private Double P1300出现在两个子类中,只需将其拉到父类即可。

如果有其他祖先没有这个属性,那么这样的查询就没有多大意义 - attributeSet 可能有也可能没有这个属性。

关于java - Hibernate:通过继承类的属性查询对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454545/

相关文章:

php - Laravel 4.1 Eloquent - 过滤关系集合

java - JPA 是否支持映射到 sql View ?

java - Hibernate/H2 @OneToMany "Referential integrity constraint violation"删除子项?

java - 我可以直接从 SpEL 表达式创建 bean 吗?

java - 使用 Jetty(编程设置)的服务器发送事件 (SSE)

hibernate - Grails上的GORM save()未保存在数据库中

java - 将 Hibernate 搜索与 RabbitMQ 集成以实现分布式后端

.net - LINQ to SQL 还是经典的 ADO.NET?

java - 从 WorkManager 的 Work/WorkInfo 获取最后更新时间

java - 如何在 spring config 中手动连接 hibernate session 工厂