我有参数列表,我想从中构建查询。实际上,我已经完成了这项工作,现在我有了巨大的方法,我正在尝试重构它。我需要一种方法将一个巨大的方法拆分为许多较小的方法,然后将它们组合为一个。
我在构建动态查询请求并需要建议时遇到了麻烦。
所以,我查看了文档“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