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.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])