1

次のクエリを実行しようとしていますが、nullポインタ例外が発生します。WHERE lockedTimestamp <= (GETDATE() - CAST('00:06' AS datetime)手動で実行でき、正常に動作するため、有効なmsSQLであることを確認しました。HQL(Hibernate Query Language)が気に入らないようです。これをデバッグする方法について何か考えはありますか?

Query query = this.em.createQuery("SELECT c FROM Content c WHERE lockedTimestamp <= (GETDATE() - CAST('00:06' AS datetime))");
4

3 に答える 3

1

EntityManager.createQueryJPQLのクエリ文字列(HQLではなく、SQLではない)が必要です。JPQLは関数を定義していませんCAST

Javaでタイムスタンプ制限を計算し、それをパラメーターとしてクエリに渡します。

Date limit = ...;
this.em.createQuery("SELECT c FROM Content c WHERE lockedTimestamp <= ?")
       .setParameter(0, limit);
于 2012-05-21T16:18:44.863 に答える
1

より明白で直感的な計算を使用してみませんか。

SELECT c FROM Content c WHERE lockedTimestamp <= DATEADD(MINUTE, -6, GETDATE());

?これはJPQLでも無効であると思いますが、他のユーザーがこの質問に遭遇した場合に備えて、一般的なクエリ自体についてはさらに詳しく説明します...

余談ですが、このクエリをストアドプロシージャに入れてみませんか?確かに、Hibernateはストアドプロシージャを呼び出すことができ、クエリを解釈したりリバースエンジニアリングしたりする必要はありません。

于 2012-05-21T16:36:34.837 に答える
1

SQLをデバッグするには、Hibernate構成プロパティに構成hibernate.show_sql = trueを追加することにより、Hibernateを起動するクエリを表示できます。

クエリはコンソールに表示され、休止状態がデータベースに対して行う正確なクエリです。

于 2012-05-21T16:59:12.017 に答える