2012-12-12 27 views
5

java.util.Dateデータ型で定義され、データベースのOracle DATE型に格納されているタイムスタンプを保持する予定の列があります。私は、完全な日付と時刻の情報が永続化され、データベースから正しく取得されたことを確認しましたが、NamedQueryで比較しようとすると、時間情報が比較で考慮されないように見えます。次のようにJPA:NamedQueryのタイムスタンプ比較:時刻データが失われました

列が定義されている(analyzeDateは、タイプjava.util.Dateである):

@Basic(optional = false) 
@Column(name = "ANALYZE_DATE") 
@Temporal(TemporalType.TIMESTAMP) 
private Date analyzeDate; 

そして、私のNamedQuery:である私は、実行

@NamedQuery(name = "BOADocument.findByBeforeAnalyzeDate", 
    query = "SELECT b FROM BOADocument b WHERE b.companyId = :companyId AND b.analyzeDate < :analyzeDate") 

、合格analyzeDateタイプ:java.util.Date:

List<BOADocument> docs = em.createNamedQuery("BOADocument.findByBeforeAnalyzeDate") 
      .setParameter("companyId", clientRecord) 
      .setParameter("analyzeDate", analyzeDate, TemporalType.TIMESTAMP) 
      .getResultList() 

Documentテーブルのすべての行のリストが返されます。ただし、NamedQueryへのパラメータとして設定した値と全く同じ値のanalyzeDateを持っています。

私が比較を逆にすると、私はタイムスタンプの時間部分が物事のb.analyzeDate側で失われていることをさらに確信しています。物事の:analyzeDate側ではありません。

JPA 1.0とHibernate 3.5を使用しています。

これは私に悩まされています。私は、あきらめてネイティブクエリを使用することに近いですが、それは不正行為のように感じます!

+0

ミリ秒単位で、パラメータとデータベース値でその値を確認できます。 – remigio

+0

Oracleデータベースの列タイプはDATEなので、そこにはミリ秒の情報は格納されていません。ミリ秒の情報はjava.util.Date側に存在するので、Date.getTime()と渡した値の両方を比較してチェックしました。エンティティから取得した値は同じです。まだ切り詰められています... – emilys

答えて

3

をそれが根底にあることが判明オラクルのタイプはTIMESTAMPでなければなりません。

DATEは時間、分、秒の情報を保持しています。これは私の目的には十分な精度ですので、TIMESTAMPではなく、ミリ秒単位で保持する予定です。時、分、秒の情報をDATEからは完璧に動作していましたが、名前付きクエリの時間データに基づく比較ではありませんでした。

私はデータベースの列の種類を変更し、以前に書いたようにコードを書き換えました。もちろん、ミリ秒も節約されますが、これは私のコードには何の副作用もありません。

1

b.companyId = BOADocument Bから1つの

SELECT bを以下のようにクエリを変更します。企業IDとCAST(TIMESTAMP AS b.analyzeDate)<:。analyzeDate」

+0

それは意味をなさないようですが、悲しいかな、それは何も変わっていません。私はそれが事件についてぞっとすることに気付きました。タイムスタンプは小文字でなければなりません。 CASTを使う方法を私に見せてもらえましたか? – emilys

関連する問題