0

我有参数列表,我想从中构建查询。实际上,我已经完成了这项工作,现在我有了巨大的方法,我正在尝试重构它。我需要一种方法将一个巨大的方法拆分为许多较小的方法,然后将它们组合为一个。

我在构建动态查询请求并需要建议时遇到了麻烦。

所以,我查看了文档“6.4.4 Detached Criteria”(http://grails.org/doc/2.2.4/guide/GORM.html#detachedCriteria)。

在“对子查询使用分离标准”一章中找到了下一个示例:

def results = Person.withCriteria {
 gt "age", new DetachedCriteria(Person).build {
     projections {
         avg "age"
     }
 }
 order "firstName"
}

而且我尝试编写一些将 DetachedCriteria 作为模拟返回的方法,例如:

DetachedCriteria insertCriteriaLong(def objClass, String cleanKey, def e) {
    new DetachedCriteria(objClass).build {
        if (e.key.toString().endsWith("_from")) {
            gte(cleanKey, e.value as Long)
        } else if (e.key.toString().endsWith("_to")) {
            lte(cleanKey, e.value as Long)
        } else {
            eq(cleanKey, e.value as Long)
        }
    }
}

在调试时,我看到该方法创建了 DetachedCriteria 对象并用正确的过滤器(条件)规则填充它。

但是后来我试图从主请求中调用这个方法,结果我得到了零标准。

    def cr = new DetachedCriteria(objClass).build { 
        insertCriteriaLong(objClass, cleanKey, e)
    }
    cr.list(params)

而“cr.list(params)”会返回很多记录。“insertCriteriaLong”被忽略。

所以,我考虑过重写并返回 Criteria 或只是一个 Closure,但我仍然没有找到正确的语法。例如,我尝试过:

Closure insertCriteriaInteger2 = { String cleanKey, def e ->
    if (e.key.toString().endsWith("_from")) {
        gte(cleanKey, e.value as Integer)
    } else if (e.key.toString().endsWith("_to")) {
        lte(cleanKey, e.value as Integer)
    } else {
        eq(cleanKey, e.value as Integer)
    }
}

你能给我小费吗,我应该尝试其他什么?

我发现下一个问题看起来很相似,但对我没有帮助: Grails/Groovy: Modify a "query"closure at runtime

4

1 回答 1

0

好的,我终于找到了解决方案。蒂姆耶茨,谢谢!

这里是。

DetachedCriteria insertCriteriaLong(DetachedCriteria previousCriteria, String cleanKey, def e) {
    if (e.key.toString().endsWith("_from")) {
        previousCriteria.gte(cleanKey, e.value as Long)
    } else if (e.key.toString().endsWith("_to")) {
        previousCriteria.lte(cleanKey, e.value as Long)
    } else {
        previousCriteria.eq(cleanKey, e.value as Long)
    }
    previousCriteria
}

即使我们有多个标准记录,它也可以工作,例如(代码被简化)。

DetachedCriteria insertCriteriaString(DetachedCriteria previousCriteria, def e) {
    10.times {
        previousCriteria.ilike(e.key, '%' + it + '%')
    }
    previousCriteria
}

实际上,我发现我们根本不能返回任何结果。因此,下一个代码也是正确的:

void insertCriteriaLong(DetachedCriteria currentCriteria, String cleanKey, def e) {
    if (e.key.toString().endsWith("_from")) {
        previousCriteria.gte(cleanKey, e.value as Long)
    } else if (e.key.toString().endsWith("_to")) {
        previousCriteria.lte(cleanKey, e.value as Long)
    } else {
        previousCriteria.eq(cleanKey, e.value as Long)
    }
}
于 2013-09-06T16:26:34.013 回答