JPA:NamedQuery中的时间戳比较:时间数据丢失

emi*_*lys 5 hibernate jpa oracle10g

我有一个目标是保存时间戳的列,该时间戳使用java.util.Date数据类型定义并存储在数据库中的Oracle DATE类型中.我已经验证了从数据库中正确保存和检索完整的日期和时间信息,但是当我尝试在NamedQuery中对它进行比较时,时间信息似乎在比较中没有考虑到.

该列定义如下(analyzeDate的类型为java.util.Date):

@Basic(optional = false)
@Column(name = "ANALYZE_DATE")
@Temporal(TemporalType.TIMESTAMP)
private Date analyzeDate;
Run Code Online (Sandbox Code Playgroud)

而我的名字:

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

然后我执行,传递analyzeDate,类型为java.util.Date:

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

我得到了Document表中所有行的列表,尽管它们对于analyzeDate的值都与我设置为NamedQuery的参数的值完全相同.

如果我反过来比较,我得不到任何线条,进一步说服时间戳的时间部分在b.analyzeDate方面丢失,而不是:analyzeDate方面.

我正在使用JPA 1.0和Hibernate 3.5.

这让我很难过,而且我已经接近放弃并使用原生查询了,但这就像是作弊!

emi*_*lys 3

事实证明,底层 Oracle 类型必须是 TIMESTAMP。

DATE 保存小时、分钟和秒信息。对于我的目的来说,这已经足够精确了,因此我计划使用它来代替 TIMESTAMP,后者也保存毫秒。正如我之前提到的,与 DATE 之间的小时、分钟和秒信息的存储和检索工作正常,但不能基于命名查询中的时间数据进行比较。

我更改了数据库列类型,瞧,代码与之前编写的一样有效。当然,我也节省了毫秒数,但这不会在我的代码中产生任何副作用。