我有3个课程Base
,Child
和Other
定义如下:
@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,它似乎是预期的行为,但我不明白它是怎么回事。另外,假设这是预期的行为,当条件使用基类中定义的属性时如何使用过滤?
由于
答案 0 :(得分:0)
我正在使用Hibernate 4.1并遇到同样的问题。 This explains如何告诉Hibernate您的条件实际定义在哪个实体类上。在@Filter注释中添加别名可以解决我的问题。
在JPQL select语句中,通过继承解析属性名称直接工作,BTW。
答案 1 :(得分:0)