【问题标题】:Using joda DateTime in parameters for native query in spring-data-jpa fails because of bad binding由于绑定错误,在 spring-data-jpa 中的本机查询参数中使用 joda DateTime 失败
【发布时间】:2015-04-02 21:59:42
【问题描述】:

这里有两个查询应该完全相同,只是一个被标记为原生,另一个不是。第一个工作正常,但第二个失败 incompatible data type in conversion

  @Transactional(readOnly = true)
  @Query(value = "select startDate from TaskMetrics where startDate between :startDate and :endDate")
  List<DateTime> findStartDateByStartDateBetween(@Param("startDate") DateTime startDate,
  @Param("endDate") DateTime endDate);

这会生成查询:

select taskmetric0_.startDate as col_0_0_ from TaskMetrics taskmetric0_ where taskmetric0_.startDate between ? and ?

有绑定

binding parameter [1] as [TIMESTAMP] - [2015-02-02 10:57:14.279]
binding parameter [2] as [TIMESTAMP] - [2015-02-04 10:57:14.281]

-

  @Transactional(readOnly = true)
  @Query(nativeQuery = true, value = "select startDate from TaskMetrics where startDate between :startDate and :endDate")
  List<DateTime> findStartDateBetween(@Param("startDate") DateTime startDate,
  @Param("endDate") DateTime endDate);

这会生成查询:

select startDate from TaskMetrics where startDate between ? and ?

使用一个绑定,这似乎也有点奇怪(尤其是为什么 #2?):

binding parameter [2] as [VARBINARY] - [2015-02-04T10:57:14.315-05:00]

我使用 Hibernate 4.3.8.Final 作为我的 JPA 2.1 提供程序,使用 Jadira Usertype 3.1.0.CR10 来支持 JodaTime。

是我做错了什么还是这是某个地方的错误?

在此处打开错误 - https://jira.spring.io/browse/DATAJPA-671

【问题讨论】:

    标签: java jpa spring-data jodatime spring-data-jpa


    【解决方案1】:

    该错误的解决方法:

      public class MyDaoClass {
    
        // Converter provided by joda time user type library 
        private TimestampColumnDateTimeMapper columnDateTimeMapper = new TimestampColumnDateTimeMapper();
    
        @Override
        public void doAction(MyObject myObject) {
            Query q = getEntityManager().createNamedQuery("MyNativeNamedQuery");
            q.setParameter("date", columnDateTimeMapper.toNonNullValue(myObject.getDate()), TemporalType.TIMESTAMP);
            q.executeUpdate(); // or select
        }
    

    【讨论】:

      【解决方案2】:

      第二个是nativeQuery,因为我知道它不适用于 joda DateTime。请改用Java.sql.Date

      【讨论】:

      • 所以这是 spring-data-jpa 中的错误?改用 java.sql.Date 对我来说不是一个可接受的解决方案。
      • 我不认为这是一个错误。
      • 不,这不是错误,这是因为您使用的是本机查询,所以 jpa 不知道锄头来映射 tha 参数,如果您使用的是 JPA 2+,您可以做一个转换器来向 jpa 添加新的值类型
      • 这有什么意义?这是失败的类型的绑定。无论查询是否为本机,这都应该适当地发生。我正在使用 Jadira 用户类型为 Joda 创建和注册转换器。如果我不是第一个查询也会失败。也许问题在于 Jadira。
      猜你喜欢
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2013-11-04
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多