Framework/Hibernate

Hibernate Order by 에서 부등호(=,<=,>=) 사용법

jeeyong 2013. 3. 26. 11:27

하이버네이트의 Hql을 사용하다 보면 Order by 절에서 부득이 하게 부등호를 사용할 경우가 있다.


아래와 같은 일반적인 쿼리문을 하이버 네이트에서 사용 할 경우 인데,


SELECT * FROM example ORDER BY basedate>=NOW() DESC, ABS(DATEDIFF(basedate, NOW())) 


이 쿼리를 하이버네이트 쿼리형식으로 수정할 경우


FROM  Example ORDER BY basedate>=NOW() DESC, ABS(DATEDIFF(basedate, NOW()))


이렇게 된다. (지금 사용하고 있는 ORDER BY은 매우 유용할 수 있는 조건절인데,  현재날짜와 basedate와 비교해서 현재와 가장 가까운 순이면서 아직 현재를 지나지 않았거나 같은 데이터를 가져오는 조건절이다. 매우 유용한 조건절이니 참고하시라. 엊제든.)


SEVERE: Servlet.service() for servlet [spring3] in context with path [] threw exception [Request processing failed; nested exception is org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: <= near ...

과 같은 에러를 발생 시킨다.


이런 에러가 발생하는 원인은 ORDER BY절의 부등호(위 쿼리문에서 <=) 때문인데 일반적인 쿼리에선 잘되지만 Hql에선 ORDER BY에선  부등호 연산식은 허용하지 않는다.


그래서 우회적으로 case 문을 사용 

 FROM  Example

 order by CASE WHEN (DATEDIFF(basedate, NOW())<=0) THEN 1 ELSE 0 END, ABS(DATEDIFF(basedate, NOW()))

이렇게 처리 하면 된ㄷㅏ.(IF 문을 사용해봤으나 그것도 같은 오류로 인해 빌드 되지 않았다. 그러므로 선택의 여지 없지 case문을 사용하시라...)


끗.