2012-04-21 3 views
2

다음 상황을 고려하십시오. 나는 수업 테이블이 있으며 모든 수업에는 요일 (0-6; 날짜가 아님)과 강의가 개최되는 수업 시간 (시간, 하루의 수업 순서 번호, 즉 1에서 10까지). 그리고 특정 요일과 시간 이후에 첫 번째 수업을 찾아야합니다.최대 절전 모드 : OR ORDER BY 절

수업 시간 (월요일 - 금요일) : 월요일 -5, 수요일 -2, 금요일 -1, 금요일 -3.

wednesday-2 이후 강의의 경우 friday-1, friday-3, friday-2 이후, monday-5, friday-5 등이 나타납니다. 따라서 이번 주말에 "오버플로"됩니다. 나는이 쿼리를 해결 I 최대 절전 모드 HQL을 사용하여 하나 개의 프로젝트에서

: 나는 정말 내가 해낸 방법을 기억하지 않지만

SELECT l FROM Lesson l 
ORDER BY (l.day > :day OR (l.day = :day AND l.hour >= :hour)), 
l.day DESC, l.hour DESC LIMIT 1 

놀랍게도,이 정말 일했다. 그것은 진정한 마법입니다.

하지만 지금은 JPA와 최대 절전 모드를 사용하는 다른 프로젝트 (이번에는 Java EE 웹 기반)에서해야합니다. 이 (다시 최대 절전 모드 및 HQL을 사용하여) 같은 일 것입니다 생각, 그것은 예외가 발생합니다 :

그에게 또는 ORDER BY 절을 가리키는
org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: OR near line 1, column 101 

.

나는 OR ORDER BY 내부가 정말 어색하지만 작동한다는 것을 알고 있으므로 괜찮다고 생각했습니다. 하지만 지금은 그걸로 무엇을 해야할지 모르겠습니다. 그것은 다른 Hibernate 버전이나 JPA의 사용 때문일 수 있습니까? (나는 버전에 대해 모르겠다. 둘 다 Hibernate 3이다.) 두 데이터베이스 모두 MySQL이었다.

어떤 도움을 주셔서 감사합니다 (또는 지정된대로 작동하는 다른 검색어를 제공해 주셔서 감사합니다).

답변

0

면책 조항, 나는 정말 절전 모드에 대해 많이 알지 못하므로 order byl.day > :day이 ""를 반환한다고 가정 할 것입니다.

나는 이것이 전혀 효과가 없다는 것에 조금 놀랐습니다. 이 상황에서 case 문을 사용하면 진행 상황을 명확하게 알 수 있습니다.

SELECT <columns> 
    FROM Lesson l 
ORDER BY case when (l.day > :day OR (l.day = :day AND l.hour >= :hour)) then 1 
       else 0 end DESC 
     , l.day DESC 
     , l.hour DESC 
LIMIT 1 
+0

이 방법이 효과적입니다. 감사! 내가 물어보기 전에 IF()를 시도했지만 그 중 하나가 NullPointerException을 던지기 위해 작동하지 않았다. – redhead