如何从另一个查询的结果执行查询

时间:2013-07-11 10:59:47

标签: grails

有效:

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

2 个答案:

答案 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)

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