web-dev-qa-db-ja.com

JPAで「3分より古い」をクエリするにはどうすればよいですか?

現在の時刻を参照する日付範囲条件をJPAクエリ(データベース間で互換性がある)に配置する方法はありますか?

できます

SELECT m FROM Mail m WHERE m.sentAt < :date

しかし、パラメーターをバインドせずにそれを実行したいと思います(これにより、名前付きクエリリポジトリの一部として構成でき、日付計算ロジックで呼び出し元のコードを入力する必要がなくなります)。

したがって、:dateの代わりに、ハードコードリテラルとして「currentTimeマイナス3分」が必要です。

14
Thilo

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分より古いレコードが返され、パラメーターのバインドは必要ありません。

3
Sergej Panic

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)
3
James