1

我有 3 个类,Base定义如下:ChildOther

@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
}

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

使用启用了myFilterOther的会话,我从我的数据库中检索了一些实例。然后,当我尝试访问该myList集合时,由于该集合被声明为惰性,Hibernate 尝试从数据库中获取该集合。但是,在生成的 SQL 查询中出现了一些我没想到的东西:table 的别名Child用于为列添加前缀propBase,并且由于该列未在 tableChild中定义(它定义在 中Base),所以我收到以下错误:

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

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

谢谢

4

2 回答 2

0

您需要使用 sql 片段别名 - https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#pc-filter-sql-fragment-alias

@Entity
public class Other {
   @Filter(
        name = "filterPropBase", 
        condition = "{b}.propBase='special'",
        aliases={@SqlFragmentAlias(alias="b", entity=Base.class)
   )
   private Set<Child> myList;
}
于 2021-03-21T04:49:40.153 回答
-1

我正在使用 Hibernate 4.1 并且遇到了同样的问题。这解释了如何告诉 Hibernate 你的条件实际上是在哪个实体类上定义的。为 @Filter 注释添加别名解决了我的问题。

在 JPQL 选择语句中,通过继承直接解析属性名称,顺便说一句。

于 2013-02-21T09:10:55.300 回答