考慮這種情況:我有一張課表,每節課有一個星期幾(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。
感謝您的任何幫助(或提供另一個將按指定工作的查詢)。
This Works!謝謝!在我問之前,我嘗試過使用IF(),但在Hibernate內部的某個地方拋出NullPointerException異常,這很奇怪。 – redhead 2012-04-21 15:06:35