Java 使用基类中定义的属性筛选条件

Java 使用基类中定义的属性筛选条件,java,hibernate,hibernate-filters,Java,Hibernate,Hibernate Filters,我有3个基本类、子类和其他类,定义如下: @Entity @Filter(name = "myFilter", condition = "propBase = 'special'") @Inheritance(strategy = InheritanceType.JOINED) public abstract class Base { private String propBase; //Getters, Setters } @Entity public class Child

我有3个基本类、子类和其他类,定义如下:

@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的会话,我从数据库中检索其他的一些实例。然后,当我尝试访问myList集合时,由于该集合被声明为lazy,Hibernate尝试从数据库中获取该集合。但是,在生成的SQL查询中有一点是我没有预料到的:表Child的别名用于前缀propBase列,并且由于该列没有在表Child中定义,而是在Base中定义的,因此我得到以下错误:

错误JDBCExceptionReporter-中的未知列“childAlias.propBase” “where子句”

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


谢谢

我正在使用Hibernate 4.1,遇到了同样的问题。如何告诉Hibernate您的条件实际上是在哪个实体类上定义的。将别名添加到@Filter注释修复了我的问题


在JPQL select语句中,通过继承直接解析属性名称。顺便说一句,您需要使用sql片段别名-

您确定不必使用注释@FilterDef来定义过滤器吗@ambiorix正如我在问题中所说,过滤器是在包级别定义的,因此是的,它是使用FilterDef注释定义的。请参阅@ambiorix它与我的问题有何关系?ThanksFix Version/s:3.5.0-Beta-2也许您使用的是Hibernate的旧版本,它不支持过滤器@MappedSuperClass