在spring-data-jpa中,在参数中使用joda DateTime进行本地查询失败,原因是绑定有误。

5
这里有两个查询应该完全相同,除了一个标记为本地语言而另一个没有。第一个正常工作,但第二个由于“转换中不兼容的数据类型”而失败。
  @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。

我做错了什么或者这是一个bug吗?

在这里开了一个bug - https://jira.spring.io/browse/DATAJPA-671

2个回答

4

解决该bug的方法:

  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
    }

非常感谢!这应该被选为正确答案。 - chaotic3quilibrium

0
第二个是一个nativeQuery,我知道它不能与joda DateTime一起使用。请改用Java.sql.Date

所以这是spring-data-jpa的一个bug吗?对我来说,改用java.sql.Date不是一个可接受的解决方案。 - Josh
我认为这不是一个错误。 - Jens
1
不,这不是一个错误,而是因为您正在使用本地查询,所以jpa不知道如何映射该参数。如果您使用的是JPA 2+,则可以使用转换器将新值类型添加到jpa中。 - rekiem87
2
这有什么道理吗?类型的绑定失败了。无论查询是否为本机,都应该适当地发生。我正在使用Jadira usertype来创建和注册Joda的转换器。如果我不是第一个查询,第一个查询也会失败。也许问题出在Jadira上。 - Josh
这个答案是错误的。请参考这个答案:https://dev59.com/x4fca4cB1Zd3GeqPjoGN#41636326 - chaotic3quilibrium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接