하이버네이트의 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문을 사용하시라...)
끗.
'Framework > Hibernate' 카테고리의 다른 글
하이버네이트(hibernate) POJO에 데이터 입력(setMethod) 를 제한하기 위한 방법 RuntimeException (0) | 2017.02.28 |
---|---|
hibernate XML 속성 값 정리 (0) | 2012.08.13 |
HQL과 Criteria를 이용한 조회 (2) | 2008.07.14 |