2012-04-04 2 views
1

Я проводил некоторое время на этом. Моя проблема связана с возвратом доменных объектов с определенными критериями и условиями:grails findAll с условиями или executeQuery

У меня есть большой набор велосипедов. Существует возможность иметь несколько велосипедов с одинаковым размером колес. Например, я могу иметь 5 велосипедов:

owner_id | bike | wheel | price | active | toolset | forLance 
_________|______|_______|_______|________|_________|__________ 
15459 |liner | 12 | 100 |  Y | null | H  
15459 |larker| 15 | 150 |  Y | null | H  
15459 |jefro | 21 | 225 |  Y | null | H  
15459 |raz | 21 | 230 |  Y | null | L  
15459 |jynx | 21 | 295 |  Y | null | P  

Мой запрос ниже извлекает все велосипеды с не-дубликатом размером колеса и низкой ценой.

MySQL запросов:

select * from bike b 
where b.owner_id = 15459 
and not exists(select * from bike 
where wheels = b.wheels AND price < b.price 
and owner_id = b.owner_id) and b.active = 'Y'; 

Результат даст мне строки с велосипедами: лайнер, larker и jefro.

Есть ли эквивалентный способ сделать это в grails // groovy? (Получить лайнер, larker и jefro в список объектов домена)

Я попытался использовать структуру, как:

def bikes = Bike.executeQuery(...) 
or 
def bike = Bike.findAll(...) 

Но я не могу выполнить запрос с аналогичной структурой к Созданный мной скрипт MySQL.

Спасибо за помощь!

ответ

2

В вашем MySQL вы используете подзапросы для извлечения данных. AFAIK это невозможно с GORM. Что вы можете сделать, это записать его в Hibernate Query Language (HQL)

Допустим, ваш доменный класс называется Bike.

Bike.findAll("from Bike as b where b.active = 'Y' and b.owner = :owner and b.id in elements(select b1.id from Bike where b1.owner = :owner and b1.active = 'Y' and b1.price < b.price)", ['owner':owner])