34

Hibernate 3 と Oracle 10 を使用してこのクエリを作成しようとしています。

from Alert alert
where alert.expiration > current_date()
order by alert.priority, alert.updated, alert.name

このようなSQLを作成しています-

Hibernate: select alert0_.ANNOUNCEMENTS_ID as ANNOUNCE1_1_, alert0_.ANNOUNCEMENT
S_NAME as ANNOUNCE2_1_, alert0_.ANNOUNCEMENTS_PRIORITY as ANNOUNCE3_1_, alert0_.
ANNOUNCEMENTS_EXPIRATION as ANNOUNCE4_1_, alert0_.ANNOUNCEMENTS_UPDATE_DATE as A
NNOUNCE5_1_ from NYC311_ANNOUNCEMENTS alert0_ where (alert0_.ANNOUNCEMENTS_EXPIR
ATION>current_date()) order by  alert0_.ANNOUNCEMENTS_PRIORITY , alert0_.ANNOUNC
EMENTS_UPDATE_DATE , alert0_.ANNOUNCEMENTS_NAME

完全にバランスの取れた括弧があるように見えるのに、「右括弧がありません」などの奇抜なエラーがすべて発生します。

なぜオラクルはこれに夢中になっているのですか?HQL クエリを記述するより良い方法はありますか?

4

2 に答える 2

51

そうではないcurrent_dateでしょうか?

Hibernate はそれを適切な方言に変換します。

実際の「Hibernate はこれをあれに変換します」という参照ドキュメントは見つかりませんでしたが、一般に、式は HQL Expressions for Hibernate 4.3 にあります。

次に、Java Persistence クエリ言語 (JPQL) の式とその意味を定義するJava Persistence API 2.0 (JPA)current_date仕様があります。

4.6.17.2.3 日時関数 functions_returning_datetime:= CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP 日時関数は、データベース サーバーの現在の日付、時刻、およびタイムスタンプの値を返します。

于 2009-02-04T21:11:57.080 に答える
9

current_date()ハイバネート機能ですか?

代わりに使用sysdateします。このような:

where alert.expiration > sysdate 

または、時刻を無視するには:

where alert.expiration > trunc(sysdate) 
于 2009-02-04T21:10:21.170 に答える