sql - GORM - 动态查询 - 分离标准?

标签 sql hibernate grails grails-orm

我有这样的工作代码:

def criteria = Instance.createCriteria()
def list = criteria.listDistinct {
    eq("saved", true)
    eq("client", client)

    and {
        basicValues {
            eq("fieldA", object.valueA())
            /** CODE BLOCK **/
        }

        customValues {
            eq("fieldB", object.valueB())
            /** CODE BLOCK **/
        }
    }

    or {
        basicValues {
            eq("fieldC", object.valueC())
            /** CODE BLOCK **/
        }

        customValues {
            eq("fieldD", object.valueD())
            /** CODE BLOCK **/
        }
    }
}

如您所见,我正在使用 ANDOR 部分创建一些条件。它们都加入了另一个条件(basicValues/customValues 与 Instance 是 1:n 关系)。/** 代码块 **/部分是一组始终相同的条件。

到目前为止,我在每个 /** CODE BLOCK **/ 地方放置了相同的条件(例如 lt("field", 10) 等...) .

我可以将这个 /** CODE BLOCK **/ 放入函数中吗?因此,这些条件将集中在一个地方,并且代码将更具可读性???

最佳答案

如果您将 /** CODE BLOCK**/ 放入单独的闭包中,则可以在您的条件中包含对它的调用。

def commonCriteria = {
    /** CODE BLOCK **/
}

def criteria = Instance.createCriteria()
def list = criteria.listDistinct {
    commonCriteria.delegate = delegate
    eq("saved", true)
    eq("client", client)

    and {
        basicValues {
            eq("fieldA", object.valueA())
            commonCriteria()
        }

        customValues {
            eq("fieldB", object.valueB())
            commonCriteria()
        }
    }
    ...
}

关于sql - GORM - 动态查询 - 分离标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25875385/

相关文章:

hibernate - JPA 大写表名

java - 如何在使用 hibernate 作为 ORM 时执行基于语言环境的排序

sql - MySQL从具有相同键的多行数据中更新1行

java - mysql 和 oracle 是否有用于自动生成的唯一标识以在 pojo 中使用的通用注释?

与下次运行相比,sql 查询需要很长时间

grails - 如何创建与 Grails 一起使用的枚举

grails - 在文本中,如果出现 "&"字,那么它不允许我在 grails 中下载

grails - 自定义 Grails 环境的行为

mysql - 内部联接?用户 ID 与其他用户 ID 的两个表连接

php - 如何进行 SQL 查询以选择与某个字符串匹配的所有行,然后根据匹配数对它们进行加权