2017-12-15 5 views
9

Hibernate current_timestamp()を使用して、データベースの時間に基づいて列にタイムスタンプを書きたいとします。私は、データベースを使用する私のサービスのシステムのシステム時間ではなく、データベース時間を使用したい。私は2つのクエリのためにデータベース時間を使用していますとロックを解除するJPAまたはネイティブ・クエリーで時間を計算する

ロッククエリ

UPDATE MyEntity e SET e.lock = current_timestamp() WHERE e.id = :id

ロック解除クエリ

UPDATE MyEntity e SET e.lock = (current_timestamp() - "30 seconds") WHERE e.id = :id

は私の最後の手段は、このようなPostgreSQLのネイティブクエリを使用することです:

SELECT CURRENT_TIMESTAMP < (CURRENT_TIMESTAMP + INTERVAL '30 second')

時間を追加/減算する方法については、サポートされている場合でもドキュメントを見つけることができません。 クエリのロックを解除するにはどうすればよいですか?

+2

Afaikまだサポートされていません... jpa 2.1では、特定のdb関数を呼び出すためにFUNC( 'functionName'、args)が導入されましたが、依然として明らかにdbに依存しています – Zeromus

+0

ちょうどメモ:Utcを使用するためにサービスとデータベースの両方を設定して、頭痛をたくさん守ってください – Zeromus

+0

ありがとうございます。私たちはどこでもUTCを使用していますが、私はまだ別のインスタンスが別のクロックにあることを心配しています。 – span

答えて

2

カラムのデフォルト値を(データベース固有の)currenttime値に設定します。 MySQLで 、 列は次のようになります。

column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP 

編集をここで

はdatetime型の列に行が更新されるたびに更新される例(MySQLの)されています

last_update DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
+0

ロック/ロック解除のクエリを使用して行を更新するために、これをどのように使用できるかわかりませんが。 – span