2012-09-24 2 views
1

이 쿼리의 형식을 지정하는 방법이 궁금합니다. 나는 3 개의 날짜가있는 테이블을 가지고 있는데, 일부는 null이 될 수있다. 세 개의 필드는 createdDate, downDate 및 fixDate입니다. 날짜에 따라 최신 항목을 쿼리하고 가져와야합니다. 예를 들어, fixDate가 null이 아닌 경우 fixDate에서 주문합니다. null 인 경우 downDate로 주문해야합니다. downDate가 null이면 createdDate에 의해 정렬합니다.GRAILS : HQL - IF (ISNULL)로 주문하십시오.

통해 MySQL은, 내가 올바른 결과를 사용하여 얻을 :

History.executeQuery("SELECT FROM History WHERE equipment=:eqpt ORDER BY " + 
"IF(ISNULL(fixDate), IF(ISNULL(downDate), createdDate, downDate), fixDate) DESC", [eqpt:equipment]) 
:

SELECT * FROM history WHERE equipment_id=88 ORDER BY IF(ISNULL(fix_date), IF(ISNULL(down_date), created_date, down_date), fix_date) DESC; 

내가 내 Grails의 프로젝트에이를 넣어 노력하고 HQL을 사용하려하고 (이 다른 변화를 시도)

는 또한 시도 : 내가 얻을

History.executeQuery("SELECT FROM History WHERE equipment=:eqpt ORDER BY " + 
    "IF(COALESCE(fixDate,downDate,createdDate) DESC", [eqpt:equipment]) 

오류는 다음과 같습니다

,536,
nexpected token: FROM near line 1, column 8 [SELECT FROM com...History WHERE equipment=:eqpt ORDER BY IF(COALESCE(fixDate, downDate, createdDate) DESC] 

createCriteria 솔루션도 있으면 도움이됩니다. 감사.

+2

어쩌면 [이] (http://stackoverflow.com/questions/1657637/ifnull-equivalent-in-hibernate -query-language)가 도움이됩니다. –

+0

@Sergio, 방금 시도했지만 불행하게도 여전히 동일한 오류 결과가 나타납니다. 고마워요 : ( – ibaralf

+1

'SELECT h FROM History h' 시도하십시오. –

답변

2

나는 그것을 한번도 시도한 적이 없지만, Hibernate documentation은 'where'절에서 coalesce()가 지원된다고 말합니다. 'select'절에서도 사용할 수있는 경우 병합 날짜를 선택한 다음 문서에 나와있는대로 주문하십시오.

"쿼리에서 반환 된 목록은 모든 속성에 의해 정렬 될 수 있습니다 아마도 뭔가 같은 반환 된 클래스 또는 구성 요소 "그래서

의 :

select h.prop1, h.prop2, coalesce(h.fixDate, h.downDate, h.createdDate) as orderDate from history h where ..... order by orderDate 
+0

예, 그게 전부입니다. 방금 뇌 기능 검사를 받았습니다. 기본적으로 나는 IF (COALESCE가 이미 조건을 처리하고있을 때 COALESCE를 사용하고 있었다. – ibaralf

관련 문제