我遇到了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
答案 0 :(得分:0)
由于属性private Double P1300
出现在两个子类中,只需将其拉到父类。
如果还有其他祖先没有这个属性,那么这样的查询没有多大意义 - attributeSet
可能或者可能没有这个属性。
答案 1 :(得分:0)
我无法访问一个好的IDE来验证这一点,但首先你需要为你的查询添加和别名。
尝试添加:
criteria.createAlias("attributeSet", "attributeSet");
我认为问题与层次结构无关,但查询中缺少别名。