2012-04-21 150 views
2

考慮這種情況:我有一張課表,每節課有一個星期幾(0-6;不是日期)和課時持續一個小時(不是時間,而是一天中的課程序號,即1到10)。我需要在特定的一天一小時之後找到第一堂課。休眠:或ORDER BY子句

鑑於這些教訓(日間時間):星期一-5,星期三-2,星期五-1,星期五-3。

在星期三-2之後的課程中,我將收到星期五-1,星期五-3,星期五-3,星期五-5之後的星期一-5,等等。所以它在本週結束時「溢出」。

在我使用Hibernate的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 

出人意料的是,這真的不錯,雖然我真的不記得我是怎麼想出了它。這是一個真正的魔法。

但現在我需要在另一個項目(這次是基於Java EE的網絡)中使用JPA和Hibernate。認爲它會工作相同(再次使用Hibernate和HQL),它會拋出異常:

org.hibernate.hql.ast.QuerySyntaxException: unexpected AST node: OR near line 1, column 101 

它指向ORDER BY子句中的OR。

我知道ORDER BY內部的OR真的很尷尬,但它確實有效,所以我認爲它是可以的。但現在我不知道該怎麼辦。難道是因爲不同的Hibernate版本還是因爲使用JPA? (我不確定版本,都是Hibernate 3)。這兩個數據庫都是MySQL。

感謝您的任何幫助(或提供另一個將按指定工作的查詢)。

回答

0

聲明,我真的不知道那麼多關於Hibernate的知識,所以我打算假設l.day > :day在您的order by「返回」布爾值。

我有點驚訝,這一切工作;我會在這種情況下使用一個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

This Works!謝謝!在我問之前,我嘗試過使用IF(),但在Hibernate內部的某個地方拋出NullPointerException異常,這很奇怪。 – redhead 2012-04-21 15:06:35