5

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

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

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

还有我的命名查询:

@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 的参数的值完全相同。

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

我将 JPA 1.0 与 Hibernate 3.5 一起使用。

这让我很难过,我几乎要放弃并使用本机查询,但这感觉就像在作弊!

4

2 回答 2

3

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

DATE 保存小时、分钟和秒信息。这对我的目的来说已经足够精确了,所以我打算使用它而不是 TIMESTAMP,它也保存毫秒。正如我之前提到的,从 DATE 到 DATE 的小时、分钟和秒信息的存储和检索工作正常,但不能在命名查询中基于时间数据进行比较。

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

于 2012-12-20T14:19:37.540 回答
1

修改查询如下

从 BOADocument b 中选择 b,其中 b.companyId = :companyId AND CAST(b.analyzeDate AS TIMESTAMP) < :analyzeDate"。

于 2012-12-13T09:30:39.047 回答