Grails - 向所有域对象添加 where 子句

Posted

技术标签:

【中文标题】Grails - 向所有域对象添加 where 子句【英文标题】:Grails - Adding a where clause to all domain objects 【发布时间】:2012-06-18 16:11:20 【问题描述】:

我们有一个连接到遗留数据库的 Grails 应用程序,其中每个表都有一个名为 deleted 的列,指示实体是否已被删除(这意味着数据实际上从未从表中删除,它会被存档一定时间后)。对于我们的每个域对象,我们想添加一个自动的where 子句,如下所示:

where deleted = false

这样我们就不必将其显式添加到应用程序中的每个查询中。有没有办法在 grails 中实现这一点?

【问题讨论】:

你好,看看this question也许对你有帮助。 【参考方案1】:

我将Hibernate Filter plugin 用于此类事情。

【讨论】:

【参考方案2】:

我不认为 GORM 直接支持这一点。但是,您可以利用 hibernate 拦截器并自己添加它。特别是,您可以使用 onPrepareStatement 挂钩将 where 子句添加到 hibernate 生成的每个查询中。例如:

// src/groovy/mypackage/MyEntityInterceptor.groovy
package mypackage
class MyEntityInterceptor extends org.hibernate.EmptyInterceptor 
    String onPrepareStatement(String sql) 
        return addNotDeletedClause(sql)
    

// grails-app/conf/spring/resources.groovy
beans = 
    entityInterceptor(MyEntityInterceptor)

不幸的是,您必须解析传入的 SQL 语句才能确定在何处插入 where 子句。

【讨论】:

以上是关于Grails - 向所有域对象添加 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

向 Grails 域类添加字段?

向 Grails 中的对象添加方法并使其全局可用

为啥 Grails 在域对象保存时不通知我错误?

Grails:扩展和嵌入域类有啥区别?

Grails 迭代域类的所有 id 的最佳方法

Grails where 查询条件限定