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.
这让我很难过,而且我已经接近放弃并使用原生查询了,但这就像是作弊!
事实证明,底层 Oracle 类型必须是 TIMESTAMP。
DATE 保存小时、分钟和秒信息。对于我的目的来说,这已经足够精确了,因此我计划使用它来代替 TIMESTAMP,后者也保存毫秒。正如我之前提到的,与 DATE 之间的小时、分钟和秒信息的存储和检索工作正常,但不能基于命名查询中的时间数据进行比较。
我更改了数据库列类型,瞧,代码与之前编写的一样有效。当然,我也节省了毫秒数,但这不会在我的代码中产生任何副作用。
| 归档时间: |
|
| 查看次数: |
8770 次 |
| 最近记录: |