【问题标题】:How do I "filter" queries (where clause) on an entity by default?默认情况下,如何“过滤”实体上的查询(where 子句)?
【发布时间】:2012-02-09 08:32:51
【问题描述】:

我的游戏中有一个休眠实体!由 mysql 数据库支持并使用 JPA 进行查询的项目。

我现在想做的是向我的应用程序添加一个“存档”工具,就用户而言,它会删除这个实体。

但是还有其他实体会引用它,所以我不能对实体进行删除,而且我希望能够从存档中恢复它。

但是我不希望它默认出现在列表或搜索中,但当然仍然需要在某些情况下访问那里的数据的能力,例如当用户检查引用它的项目时。

有许多引用实体的查询,我可以为每个查询添加一个 WHERE 子句,但我也使用一些内置的查询方法,例如 findAll()。

如果我能以某种方式默认添加 where 子句,我认为会更简洁。

有什么办法吗?

【问题讨论】:

标签: hibernate jpa playframework


【解决方案1】:

这里有两种解决方案:

  1. 如果你使用的是 Hibernate,你可以在实体 bean 上使用@Where(clause = "column to filer")。

    @Where(clause = "isActive='false'")
    public class Product {
        //...
        @Column
        private Boolean isActive;
    }
    
    
  2. 或者如果使用 EclipseLink JPA 实现,则使用 @AdditionalCriteria("column to filer") 定义数据的参数化视图。

    @AdditionalCriteria("isActive='false'")
    public class Product {
        //...
        @Column
        private Boolean isActive;
    }
    
    

更多信息:

【讨论】:

    【解决方案2】:

    您可以在您的实体上使用 Hibernate @FilterDef 和 @Filter 注释。 请参阅文档。 http://docs.jboss.org/hibernate/orm/4.0/manual/en-US/html/filters.html

    您可能还想为 JPA 插件创建一个拦截器/钩子,它会在启动休眠会话时自动启用您的过滤器……但首先,控制器中的 @Before 过滤器应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 1970-01-01
      • 2013-03-17
      • 2018-08-20
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2012-09-18
      相关资源
      最近更新 更多