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を使用しています。
これは私に悩まされています。私は、あきらめてネイティブクエリを使用することに近いですが、それは不正行為のように感じます!
ミリ秒単位で、パラメータとデータベース値でその値を確認できます。 – remigio
Oracleデータベースの列タイプはDATEなので、そこにはミリ秒の情報は格納されていません。ミリ秒の情報はjava.util.Date側に存在するので、Date.getTime()と渡した値の両方を比較してチェックしました。エンティティから取得した値は同じです。まだ切り詰められています... – emilys