我想将此XML发送到rest 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查询之前,是否需要转换日期值? 还是我需要使用其他类型的日期?
答案 0 :(得分:1)
您正在将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
类)。
答案 1 :(得分:1)
因为您使用了createQuery
和JPQL,所以预期的类型是在解析过程中确定的,而您在PaymentTransactions
类中指定的类型是java.util.Date
。
只需将created_at
类中PaymentTransactions
的类型更改为LocalDateTime
。 Hibernate的最新版本完全支持它。