【问题标题】:Hibernate how to ignore @Where annotationHibernate如何忽略@Where注解
【发布时间】:2016-11-28 09:58:45
【问题描述】:

我有一个实体:

@Entity
@Table(name = "[Usermaster]")
@Where(clause = "isDeleted = 0")
public class User {
//...
}

在某些流程中,即使 isDeleted 不为 0,我也需要忽略 @Where 注释并获取用户。我该怎么做? (我使用 CRUD 存储库来查询)

【问题讨论】:

标签: java hibernate


【解决方案1】:

@Where 设置有一个动态版本,它是@Filter。见:

Hibernate 能够预先定义过滤条件并在类级别和集合级别附加这些过滤器。过滤条件允许您定义类似于现有"where" 属性的限制子句,可用于类和各种集合元素。

简而言之,@Filter 的管理有点复杂:

  • 定义过滤器需要<filter-def> / @FilterDef
  • <filter> / @Filter 必须分配给类或集合
  • 过滤器必须在会话级别启用,例如:session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");

因此,虽然有点复杂,但它提供了我们所需要的:动态 @Where 在运行时打开/关闭

【讨论】:

  • @Filter 默认是关闭的,所以为了在整个系统中应用它,我需要在很多地方添加代码。我正在寻找透明的解决方案,因此我只能在不需要过滤器的少数情况下添加新代码
  • 是的,@Filter 管理更具挑战性。另一方面,这是方式——唯一的方式——如何动态评估@Where。 IE。 @where 是固定映射。没办法关掉。我知道这不是您想要的那么好的答案...但另一方面,我对这样的过滤器的经验非常好。有了一些 AOP,它会为我们自动启用...假设 99% 的情况。如果需要,我们可以将其关闭..这样就可以了 ;)
  • 感谢您的回答我试图找到一种方法来找到由 spring-data 创建新会话的代码,以便弄清楚我如何覆盖它并放置我的代码以启用@Filter,但我没有成功。
【解决方案2】:

老问题,但答案可能是here

简单的解决方案是使用原生 SQL:

lst = sessionFactory.getCurrentSession().
createSQLQuery("select {entb.*}  from EntityB entb where  is_deleted=1")                            
       .addEntity("entb", EntityB.class)
       .list();

【讨论】:

  • 你知道吗,在使用 @Query 和 JPQL 时是否会发生同样的情况?
  • 它应该适用于 JPQL,最好的猜测就是尝试一下。
  • 感谢分享,这为我的原生查询实现打开了很多重构点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多