5

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を使用しています。

これは私を困惑させています、そして私はあきらめてネイティブクエリを使用することに近いです、しかしそれは浮気のように感じます!

4

2 に答える 2

3

基になるOracleタイプはTIMESTAMPでなければならないことがわかりました。

DATEは、時、分、秒の情報を保持します。これは私の目的には十分な精度であるため、ミリ秒も保持するTIMESTAMPの代わりに使用することを計画していました。前述したように、DATEとの間の時間、分、秒の情報の保存と取得は完全に機能していましたが、名前付きクエリの時間データに基づく比較は機能していませんでした。

データベースの列タイプと出来上がりを変更しました。以前に作成したコードは機能します。もちろん、ミリ秒も節約できますが、コードに副作用はありません。

于 2012-12-20T14:19:37.540 に答える
1

次のようにクエリを変更します

SELECT b FROM BOADocument b WHERE b.companyId =:companyId AND CAST(b.analyzeDate AS TIMESTAMP)<:analyzeDate"。

于 2012-12-13T09:30:39.047 に答える