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

Pet*_*zov 2 java hibernate jpa

我想将此 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>
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

但是当我提出请求时,我得到:

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

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

Jes*_*per 9

您正在设置start_date,即 a 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));
Run Code Online (Sandbox Code Playgroud)

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

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

  • Hibernate 从 5.0 开始在一个单独的模块中支持 `java.time` 类,从 5.2 开始它是内置的。 (2认同)

col*_*ict 5

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

只需将类created_at内部的类型更改PaymentTransactionsLocalDateTime. Hibernate 的最新版本完全支持它。