2013-07-11 64 views
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()适用于参数类型:()values:[]

尝试2)个createCriteria后:

... 
postResults = results.getAllByProperty3GreaterThan(0) 

它给出了错误:否方法的签名:java.util.ArrayList.getAllByProperty3GreaterThan()是适用于参数类型:(java.lang中.Integer)值:[0]

不包括createCriteria中所有内容的原因是preResults(或postResults)是Service的函数的结果...我在此省略了Service(并更改了变量的名称bles)来简化。

回答

0

你不能连锁findBy像这样的发现者(或标准)......第一个发现者在域类上被调用(这很好,因为发现者是域类的方法),但它返回一个PersistentSet它没有findBy方法就可以了。

有两件事情(我能想到的),你可以尝试:

  • 使用criteria,然后再results.findAll { it.property3 }但获取所有结果存入内存,也完全过滤有
  • 创建一个命名查询(你可以链接这些,并在末尾放一个findBy)......像这样的DomainClass.myNamedQuery.findAllByProperty3GreaterThan(0)。指定的查询应该执行你问题中的criteria。查看更多关于指定查询here的信息。
+0

我不明白第一个想法@ zoran119。你能举个例子吗?第二个想法应该能够工作(如果我能够将指定的查询从Controller传递到服务),但它看起来不是为此目的而做的......:/ – chelder

+1

您不需要传递指定的查询从控制器到服务。您只需在域类中声明指定的查询(按照我链接的文档),并简单地在服务中使用它:'DomainClass.myNamedQuery.findAllByProperty3GreaterThan(0)'。 – zoran119

+1

第一个想法是这样的......首先做'def c = DomainClass.createCriteria()',然后'def results = c.list {/ * stuff * /}',最后'def filteredResults = results。 findAll {it.property3}'。请注意,如果it.property3的值大于零(只是写'it.property3> 0'的简写方式),它将返回“true”。 – zoran119

0

即使您的服务方法与property3做同样的事情,下面的问题也会出现什么问题?

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

你有额外存在于服务方法逻辑其他该琐碎一个衬里,不能在上述条件来表示?

DomainClass.getAllByProperty3GreaterThan(0)

我只是好奇,想知道背后坚持服务方法的基本原理。

+0

它可以用一个标准来表示,但是Controller会长大很多,代码会变得不那么清晰。这个服务的调用应该是这样的:'postResults = AdvancedFilterService.function(results,params.param3)'你是否希望我在这里复制和粘贴服务的真实代码? (这还没有工作) – chelder

相关问题