默认情况下,如何在实体上“过滤”查询(where子句)?

时间:2012-02-09 08:32:52

标签: hibernate jpa playframework

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

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

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

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

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

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

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

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

你可能还想为JPA插件创建一个拦截器/钩子,它可以在启动hibernate会话时自动启用你的过滤器......但是一开始,你的控制器中的@Before过滤器就可以了。

答案 1 :(得分:0)

您在这里有两种解决方案:

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

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

  2. 或者如果使用EclipseLink JPA实现,则使用@AdditionalCriteria("column to filer")来定义数据的参数化视图。

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

有关更多信息: