【问题标题】:Hibernate: Querying objects by attributes of inherited classesHibernate:通过继承类的属性查询对象
【发布时间】:2011-01-28 02:43:07
【问题描述】:

我在使用 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 它应该在所有子类中搜索以找到我要过滤的属性?

谢谢迈克尔D

【问题讨论】:

    标签: java hibernate orm


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。问题不仅在于某些子类没有该属性,而且ClassB1,ClassB2等被添加为“插件”。这意味着我不知道那里有哪些属性。但我必须能够搜索在属性集中具有特定属性/值的任何记录对象。通常我会将这样的属性集实现为键/值表,而不是通过子类化 ClassA,但正如我所说,类层次结构已经给出......
    【解决方案2】:

    我无法使用好的 IDE 来验证这一点,但乍一看,您需要为查询添加别名。

    尝试添加:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多