2013-07-11 5 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) являются результатом функции службы ... Я опустил Сервис здесь (и изменил имя v ariables) для упрощения.

ответ

0

Вы не можете подключить findBy искатели (или критерии), подобные этому ... первый искатель вызывается в классе домена (и это прекрасно, потому что поисковики являются методами класса домена), но возвращает PersistentSet, что делает не имеют методов findBy.

Есть 2 вещи (я могу думать), вы можете попробовать:

  • Используйте criteria первый, а затем results.findAll { it.property3 } но извлекает все результаты в памяти и не фильтруя там
  • Создание именованного запроса (вы можете связать их и положить findBy в конце) ... что-то вроде этого DomainClass.myNamedQuery.findAllByProperty3GreaterThan(0). Именованный запрос должен делать то, что делает criteria в вашем вопросе. Подробнее о названных запросах читайте here.
+0

Я не понимаю первую идею, @ zoran119. Не могли бы вы привести мне пример, пожалуйста? Вторая идея должна работать (если я могу передать именованный запрос из Контроллера в Службу), но это не выглядит для этой цели ...:/ – chelder

+1

Вам не нужно передавать именованный запрос от контроллера к сервису. Вы просто объявляете именованный запрос в классе домена (в соответствии с документацией, которую я связал), и просто используем его в сервисе следующим образом: 'DomainClass.myNamedQuery.findAllByProperty3GreaterThan (0)'. – zoran119

+1

Первая идея была бы такой: сначала сделайте 'def c = DomainClass.createCriteria()', затем 'def results = c.list {/ * stuff * /}', а затем, наконец, 'def filterResults = results. findAll {it.property3} '. Обратите внимание, что 'it.property3' вернет' true', если его значение больше нуля (просто сокращенный способ записи 'it.property3> 0') – zoran119

0

В чем проблема при выполнении, как показано ниже, даже если ваш метод обслуживания делает то же самое по адресу property3?

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

У Вас есть дополнительная логика, присутствующие в методе обслуживания другой, что тривиальный один вкладыш, который не может быть представлен в приведенных выше критериях?

DomainClass.getAllByProperty3GreaterThan(0)

Я просто интересно узнать обоснование придерживаться метода обслуживания.

+0

Он может быть представлен с одним критерием, но контроллер будет расти много, и код станет менее понятным. Вызов службы будет выглядеть примерно так: 'postResults = AdvancedFilterService.function (results, params.param3)' Вы хотите, чтобы я копировал и вставлял реальный код службы здесь? (который еще не работает) – chelder

Смежные вопросы