使用基类中定义的属性过滤条件

时间:2013-02-01 08:56:56

标签: java hibernate hibernate-filters

我有3个课程BaseChildOther定义如下:

@Entity
@Filter(name = "myFilter", condition = "propBase = 'special'")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Base {
   private String propBase;

   //Getters, Setters
}

@Entity
public class Child extends Base {
   private String propChild;

   //Getters, Setters
}

@Entity
public class Other {
   @Filter(name = "myFilter", condition = "propBase = 'special'")
   private Set<Child> myList;

   //Getters, Setters
}

假设过滤器是在包级别定义的,因此所有使用它的类都可以看到它。

使用启用 myFilter 的会话,我从数据库中检索Other的一些实例。然后,当我尝试访问myList集合时,由于集合被声明为惰性,Hibernate尝试从数据库中获取集合。但是,在生成的SQL查询中有一些我没想到的:表Child的别名用于为propBase列添加前缀,并且由于此列未在表{{ 1}}(它在Child中定义),我得到以下错误:

  

错误JDBCExceptionReporter - 未知列'childAlias.propBase'   'where clause'

根据这个thread,它似乎是预期的行为,但我不明白它是怎么回事。另外,假设这是预期的行为,当条件使用基类中定义的属性时如何使用过滤?

由于

2 个答案:

答案 0 :(得分:0)

我正在使用Hibernate 4.1并遇到同样的问题。 This explains如何告诉Hibernate您的条件实际定义在哪个实体类上。在@Filter注释中添加别名可以解决我的问题。

在JPQL select语句中,通过继承解析属性名称直接工作,BTW。

答案 1 :(得分:0)