2

この状況を考えてみましょう: 私はレッスンのテーブルを持っています。すべてのレッスンには曜日 (0-6; 日付ではありません) とレッスンが開催されるレッスン時間 (時間ではなく、1 日のレッスンのシーケンス番号) があります。 、すなわち 1 から 10)。そして、特定の日と時間の後の最初のレッスンを見つける必要があります。

これらのレッスン (1 日の時間) を考えると: monday-5、wednesday-2、friday-1、friday-3。

水曜日-2 の後のレッスンでは、金曜日-1、金曜日-2 の後に金曜日-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

驚いたことに、これは本当にうまくいきましたが、どうやって思いついたのか覚えていません。それは本当の魔法です。

しかし今、JPA と Hibernate を使用する別のプロジェクト (今回は Java EE Web ベース) でそれを行う必要があります。同じように機能すると考えて (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 でした。

助けてくれてありがとう(または指定どおりに機能する別のクエリを提供してください)。

4

1 に答える 1

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
于 2012-04-21T13:09:17.877 に答える