参数值[2018-04-08T11:02:44]与预期类型[java.util.Date(n / a)]不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了参数值[2018-04-08T11:02:44]与预期类型[java.util.Date(n / a)]不匹配相关的知识,希望对你有一定的参考价值。

我想将此XML发送到其他api服务器:

XML请求:

<reconcile>
  <start_date>2018-04-08T11:02:44</start_date>
  <end_date>2018-04-08T11:02:44</end_date>
  <page>1</page>
</reconcile>

JAXB代码:

@XmlRootElement(name = "reconcile")
@XmlAccessorType(XmlAccessType.FIELD)
public class Reconcile {

    @XmlElement(name = "start_date")
    @XmlJavaTypeAdapter(LocalDateTimeXmlAdapter.class)
    public LocalDateTime start_date;
    @XmlElement(name = "end_date")
    @XmlJavaTypeAdapter(LocalDateTimeXmlAdapter.class)
    public LocalDateTime end_date;
    @XmlElement(name = "page")
    public String page;

SQL查询:

public List<PaymentTransactions> transactionsByDate(LocalDateTime start_date, LocalDateTime end_date) throws Exception {

        String hql = "select e from " + PaymentTransactions.class.getName() + " e where e.created_at >= ? and e.created_at <= ?";
        Query query = entityManager.createQuery(hql).setParameter(0, start_date).setParameter(1, end_date));
        List<PaymentTransactions> paymentTransactions = (List<PaymentTransactions>) query.getResultList();
        return paymentTransactions;
    }

但当我提出要求时,我得到:

java.lang.IllegalArgumentException: Parameter value [2018-04-08T11:02:44] did not match expected type [java.util.Date (n/a)]

在将其作为SQL查询的参数发送之前,是否需要转换Date值?或者我需要使用其他类型的日期?

答案

您正在设置start_date,这是一个LocalDateTime,作为SQL的参数;错误消息告诉你它想要一个java.util.Date,并且它不理解LocalDateTime对象。你需要转换它:

Date startDate = Date.from(start_date.atZone(ZoneId.systemDefault()).toInstant());
Date endDate = Date.from(end_date.atZone(ZoneId.systemDefault()).toInstant());

Query query = entityManager.createQuery(hql)
                  .setParameter(0, startDate).setParameter(1, endDate));

(这假设您正在使用java.time.LocalDateTime并且您想要使用系统的默认时区)。

这是必要的,因为不幸的是JPA / Hibernate不会(还)自动理解相对较新的java.time类(它要求你使用旧的java.util.Date类)。

另一答案

因为你使用createQuery和JPQL,所以在解析期间确定了预期的类型,你在PaymentTransactions类中指定的类型是java.util.Date

只需将created_at类中的PaymentTransactions类型更改为LocalDateTime。它得到了Hibernate最新版本的完全支持。

以上是关于参数值[2018-04-08T11:02:44]与预期类型[java.util.Date(n / a)]不匹配的主要内容,如果未能解决你的问题,请参考以下文章

从“GET”参数(JavaScript)中获取值[重复]

这是一个有效的日期时间值:00-2-11-30T00:00:00.000 + 02:00

将 C 函数和参数作为右值引用传递

返回值与参数的泛型一致

第44课 函数参数的秘密 (上)

T-SQL - 如何编写条件连接