0

有用:

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(并更改了变量的名称)以简化。

4

2 回答 2

0

你不能findBy像这样链接查找器(或标准)......第一个查找器在域类上调用(这很好,因为查找器是域类的方法),但它返回一个PersistentSet没有findBy方法的。

您可以尝试两件事(我能想到):

  • 先使用criteria然后再使用,results.findAll { it.property3 }但这会将所有结果提取到内存中并在那里进行过滤
  • 创建一个命名查询(您可以将它们链接起来并放在findBy最后)......像这样的东西DomainClass.myNamedQuery.findAllByProperty3GreaterThan(0)。命名查询应该执行criteria您问题中的操作。在此处查看有关命名查询的更多信息。
于 2013-07-11T11:20:11.757 回答
0

即使您的服务方法做同样的事情,下面的问题是什么property3

def results = c.list {
    ge("property1", params.param1.toInteger())
    le("property2", params.param2.toFloat())
    gt("property3", 0)
}

除了微不足道的一条线之外,您在服务方法中是否存在额外的逻辑,这些逻辑无法在上述标准中表示?

DomainClass.getAllByProperty3GreaterThan(0)

我只是想知道坚持服务方法背后的理由。

于 2013-07-11T13:46:10.283 回答