我在使用 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/