1

Dateこのように、2 つのフィールドを持つ永続オブジェクトがあります。

@Temporal(TemporalType.TIMESTAMP)
private Date generated;

@Temporal(TemporalType.TIMESTAMP)
private Date expirationTime;

オブジェクトの構築時に、フィールドexpirationTimeに基づいて初期化されますgenerated

this.expirationTime = new Date(generated.getTime() + ttlMillis);

JPAクエリを使用して、期限切れのすべてのオブジェクトをデータベースから削除しようとしています

Query q = em.createQuery("delete from MyObject t where CURRENT_TIMESTAMP > t.expirationTime");
q.executeUpdate();

しかし、簡単なテストを実行すると

MyObject o = new MyObject(somePastDate, someTTL);
em.persist(o);
... create the query above
q.executeUpate();

行が削除されていないことを示します。私が間違っていることについての手がかりはありますか?HSQLDb でテストを実行し、Hibernate を JPA プロバイダーとして使用しています。

編集:解決しましたが、このバージョンが異なる動作をする理由がわかりません。

Query q = em.createQuery("delete from MyObject t where :now > t.expirationTime");
q.setParameter("now", new Date());
q.executeUpdate();

CURRENT_TIMESTAMP他のフィールドとの比較が失敗した場合の使用は何ですか?

4

1 に答える 1

0

パラメータを設定していないため、クエリは名前付きパラメータを取得する必要があります。

Query q = em.createQuery("delete from MyObject t where CURRENT_TIMESTAMP > :expirationTime");
q.setParameter("expirationTime" , yourObject.getExpirationTime());//or your getter
q.executeUpdate();

ここにトピックを強制するためのリンクを追加します。

動作するかどうかを確認してください:-)

于 2013-05-15T15:22:55.077 に答える