現在の時刻を参照する日付範囲条件をJPAクエリ(データベース間で互換性がある)に配置する方法はありますか?
できます
SELECT m FROM Mail m WHERE m.sentAt < :date
しかし、パラメーターをバインドせずにそれを実行したいと思います(これにより、名前付きクエリリポジトリの一部として構成でき、日付計算ロジックで呼び出し元のコードを入力する必要がなくなります)。
したがって、:date
の代わりに、ハードコードリテラルとして「currentTimeマイナス3分」が必要です。
Hibernate JPA実装とOracle方言を使用している場合は、現在の日付と時刻を返すSYSDATE
関数を使用できます。 SYSDATE
に1を追加すると、1日追加されます。
分数の追加もサポートされています。
sysdate + 1/24
_は1時間を追加しますsysdate + 1/(24*60)
は1分追加しますsysdate + 1/(24*60*60)
は秒を追加しますしたがって、:dateの代わりに、ハードコードリテラルとして「currentTimeマイナス3分」が必要です。
sysdate - 3/(24*60)
は、現在の日付と時刻から3分を減算します。
_SELECT m FROM Mail m WHERE m.sentAt < sysdate - 3/(24*60)
_
3分より古いレコードが返され、パラメーターのバインドは必要ありません。
JPAは、CURRENT_TIMESTAMP関数とCURRENT_TIME関数をサポートしています。
https://en.wikibooks.org/wiki/Java_Persistence/JPQL#Functions
JPA仕様には日付関数がありませんが、EclipseLinkなどの一部のJPAプロバイダーにはあります。
http://Java-persistence-performance.blogspot.com/2012/05/jpql-vs-sql-have-both-with-eclipselink.html
JPA 2.1は、データベース関数を呼び出すためのFUNCTION演算子も定義しています。
EclipseLinkで私は試してみます、
SELECT m FROM Mail m WHERE m.sentAt < SQL("(sysdate - interval '3' minute)")
または、
SELECT m FROM Mail m WHERE m.sentAt < SQL("(? - interval '3' minute)", CURRENT_TIMESTAMP)