【发布时间】:2014-07-11 15:24:35
【问题描述】:
我创建了一个新的 Grails 项目,只有:
TestDomain.class:
class TestDomain {
String var1
String var2
}
Bootstrap.groovy:
def init = { servletContext ->
if (TestDomain.count() == 0) {
new TestDomain(var1: "a", var2: "b").save()
new TestDomain(var1: "a", var2: "c").save()
}
}
TestController.groovy:
def index() {
def detachedCriteria = TestDomain.where { var1 == "a" }
detachedCriteria = detachedCriteria.where { var2 == "b" }
render detachedCriteria.list()
}
def indexWithMethod() {
def detachedCriteria = TestDomain.where { var1 == "a" }
detachedCriteria = addClause(detachedCriteria)
render detachedCriteria.list()
}
def addClause(detachedCriteria) {
detachedCriteria = detachedCriteria.where { var2 == "b" }
return detachedCriteria
}
调用 index 仅返回 1 个实例(如预期的那样),但 indexWithMethod 会返回两个实例元素。为什么 indexWithMethod 不等于 index?
我使用的是 Grails 2.4.2,但这也发生在 2.3.6 中。
【问题讨论】:
-
如果您将
addClause方法的参数静态键入为grails.gorm.DetachedCriteria,这样可以吗? -
这与您的问题无关,但您不应在控制器中定义像
def addClause(detachedCriteria)这样的方法,因为编译器会将其视为控制器操作,而事实并非如此。你应该用protected addClause(detachedCriteria)来定义它。只有公共方法被转换为操作。 -
不,静态键入返回类型没有帮助,如果我将参数设为静态类型也无济于事。
-
(哦,是的,我知道我应该将内部方法设为私有(或受保护?为什么不私有?),但这只是我制作的一个示例项目:))
标签: grails grails-orm where composition detachedcriteria