有效:
def c = DomainClass.createCriteria()
def results = c.list {
ge("property1", params.param1.toInteger())
le("property2", params.param2.toFloat())
}
我们想再增加一个条件:
尝试1)在createCriteria之前:
def preResults = DomainClass.getAllByProperty3GreaterThan(0)
def c = preResults.createCriteria()
...
它给出了错误:没有方法签名:java.util.ArrayList.createCriteria()适用于参数类型:()值:[]
尝试2)在createCriteria之后:
...
postResults = results.getAllByProperty3GreaterThan(0)
它给出了错误:没有方法签名:java.util.ArrayList.getAllByProperty3GreaterThan()适用于参数类型:(java.lang.Integer)值:[0]
不包括createCriteria中的所有内容的原因是preResults(或postResults)是Service的一个函数的结果......我在这里省略了Service(并更改了变量的名称)以简化。
答案 0 :(得分:0)
您无法链接findBy
发现者(或标准)......在域类上调用第一个查找程序(这很好,因为查找程序是域类的方法),但它返回一个PersistentSet
没有findBy
方法。
你可以尝试两件事(我能想到):
criteria
,然后使用results.findAll { it.property3 }
,但会将所有结果提取到内存中并进行过滤findBy
)......类似于此DomainClass.myNamedQuery.findAllByProperty3GreaterThan(0)
。命名查询应该执行问题中的criteria
。详细了解命名查询here。答案 1 :(得分:0)
如下所示,即使您的服务方法与property3
做同样的事情,会出现什么问题?
def results = c.list {
ge("property1", params.param1.toInteger())
le("property2", params.param2.toFloat())
gt("property3", 0)
}
你在服务方法中是否有额外的逻辑,除了上面的标准中无法表示的普通的一个班轮?
DomainClass.getAllByProperty3GreaterThan(0)
我很想知道坚持服务方法背后的理由。