java.util.Dateデータ型で定義され、データベースのOracleDATE型に格納されているタイムスタンプを保持するように指定された列があります。完全な日付と時刻の情報が保持され、データベースから正しく取得されていることを確認しましたが、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")
次に、java.util.DateタイプのanalyzeDateを渡して実行します。
List<BOADocument> docs = em.createNamedQuery("BOADocument.findByBeforeAnalyzeDate")
.setParameter("companyId", clientRecord)
.setParameter("analyzeDate", analyzeDate, TemporalType.TIMESTAMP)
.getResultList()
Documentテーブルのすべての行のリストが返されますが、analyzeDateの値は、NamedQueryのパラメーターとして設定した値とまったく同じです。
比較を逆にすると、行が表示されず、タイムスタンプの時間部分が、:analyzeDate側ではなく、b.analyzeDate側で失われていることをさらに確信できます。
Hibernate3.5でJPA1.0を使用しています。
これは私を困惑させています、そして私はあきらめてネイティブクエリを使用することに近いです、しかしそれは浮気のように感じます!