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

时间:2010-03-16 13:15:27

标签: 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类引用其中一个类的一个实例。

现在我的问题: 我想要做的是选择我的数据库中的所有记录对象,这些对象引用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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我无法访问一个好的IDE来验证这一点,但首先你需要为你的查询添加和别名。

尝试添加:

criteria.createAlias("attributeSet", "attributeSet");

我认为问题与层次结构无关,但查询中缺少别名。