【问题标题】: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.DateTimetoString() 返回“2019-05-13”。

这些查询参数在针对 MS Sql Server 运行的生产环境中运行良好。 (恶心!)

现在,单元测试正在针对 HSQLDB 运行。我提供了相同的值,它会抛出:

javax.persistence.PersistenceException: org.hibernate.exception.DataException: data exception: invalid datetime format

当它尝试运行查询时。

由于参数的格式完全相同,我假设问题在于 HSQLDB 的日期字符串的格式。

那么,现在呢?我该如何继续前进?我已经检查了采用 TEMPORAL 或其他格式的 setParameter 格式,但这不适用于 JODA 时间。

我已经与我的技术主管讨论过不使用本机查询,而是使用休眠查询,但我对此置若罔闻。我是否还有其他选择,这样我就不必与我的技术主管为我们的 DAO 编写单元测试了?

【问题讨论】:

  • 可能的重复/解决方案....stackoverflow.com/questions/33700721/…
  • @WEI_DBA,不,我找到了那个。这只适用于甲骨文。 MS SQL Server 没有实现 TO_DATE 函数,而是使用它的自定义版本。所以,那个解决方案对我不起作用。
  • @WEI_DBA,当然,除非你看到了我没有看到的东西。
  • 好的。谢谢..我不熟悉hibernate。只是想帮忙。但是,如果它正在寻找时间,请在时间格式中插入 0 以查看是否可以通过。
  • HSQLDB 2.4.x 需要一个 java.time 对象。以前的版本需要一个 java.sql 对象。字符串被转换为 java 对象,但它需要小时:分钟:秒部分以及日期部分。

标签: sql-server hibernate unit-testing hsqldb


【解决方案1】:

好吧,我很尴尬地承认我花了多长时间才弄清楚这一点。

我只是将 LocalDate 转换为 java 日期,然后用它来设置 TemporalType 参数。

    Date date = localDate.toDate();
    countQuery.setParameter(parmName, date, TemporalType.DATE);

这似乎工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多