gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:22:00 26 4
gpt4 key购买 nike

我有一个列,用于保存时间戳,该时间戳是使用 java.util.Date 数据类型定义的,并存储在数据库中的 Oracle DATE 类型中。我已经验证了完整的日期和时间信息已保存并从数据库中正确检索,但是当我尝试在 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()

我得到了文档表中所有行的列表,尽管它们的analyzeDate 值与我设置为NamedQuery 参数的值完全相同。

如果我反转比较,我不会得到任何行,这进一步让我相信时间戳的时间部分在 b.analyzeDate 方面丢失,而不是在 :analyzeDate 方面丢失。

我正在使用 JPA 1.0 和 Hibernate 3.5。

这让我很困惑,我几乎要放弃并使用 native 查询,但这感觉就像作弊!

最佳答案

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

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

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

关于hibernate - JPA:NamedQuery 中的时间戳比较:时间数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13837277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com