不同数据库引擎之间的原生查询日期格式
Posted
技术标签:
【中文标题】不同数据库引擎之间的原生查询日期格式【英文标题】:Native Query date formats between different database engines 【发布时间】:2019-05-20 17:13:20 【问题描述】:我正在使用以下代码为 Hibernate 创建本机查询
final Query countQuery = entityManager.createNativeQuery( countSql );
if ( countCriteria.getStartDate() != null )
final String startDate = countCriteria.getStartDate().toString();
countQuery.setParameter( START_DATE_PARAMETER, startDate );
我班级的 startDate 是 org.joda.time.DateTime
,toString()
返回“2019-05-13”。
这些查询参数在针对 MS Sql Server 运行的生产环境中运行良好。 (恶心!)
现在,单元测试正在针对 HSQLDB 运行。我提供了相同的值,它会抛出:
javax.persistence.PersistenceException: org.hibernate.exception.DataException: data exception: invalid datetime format
当它尝试运行查询时。
由于参数的格式完全相同,我假设问题在于 HSQLDB 的日期字符串的格式。
那么,现在呢?我该如何继续前进?我已经检查了采用 TEMPORAL 或其他格式的 setParameter 格式,但这不适用于 JODA 时间。
我已经与我的技术主管讨论过不使用本机查询,而是使用休眠查询,但我对此置若罔闻。我是否还有其他选择,这样我就不必与我的技术主管为我们的 DAO 编写单元测试了?
【问题讨论】:
可能的重复/解决方案....***.com/questions/33700721/… @WEI_DBA,不,我找到了那个。这只适用于甲骨文。 MS SQL Server 没有实现 TO_DATE 函数,而是使用它的自定义版本。所以,那个解决方案对我不起作用。 @WEI_DBA,当然,除非你看到了我没有看到的东西。 好的。谢谢..我不熟悉hibernate。只是想帮忙。但是,如果它正在寻找时间,请在时间格式中插入 0 以查看是否可以通过。 HSQLDB 2.4.x 需要一个 java.time 对象。以前的版本需要一个 java.sql 对象。字符串被转换为 java 对象,但它需要小时:分钟:秒部分以及日期部分。 【参考方案1】:好吧,我很尴尬地承认我花了多长时间才弄清楚这一点。
我只是将 LocalDate 转换为 java 日期,然后用它来设置 TemporalType 参数。
Date date = localDate.toDate();
countQuery.setParameter(parmName, date, TemporalType.DATE);
这似乎工作正常。
【讨论】:
以上是关于不同数据库引擎之间的原生查询日期格式的主要内容,如果未能解决你的问题,请参考以下文章