Значение параметра [2018-04-08T11: 02: 44] не соответствует ожидаемому типу [java.util.Date (n / a)] - PullRequest
0 голосов
/ 05 октября 2018

Я хочу отправить этот 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)]

Нужно ли преобразовывать значение Date, прежде чем я отправлю его в качестве параметра для запроса SQL?Или мне нужно использовать другой тип даты?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Поскольку вы используете createQuery и JPQL, ожидаемый тип определяется во время синтаксического анализа, и тот, который вы указали в классе PaymentTransactions, равен java.util.Date.

Просто измените тип created_at внутри класса PaymentTransactions до LocalDateTime.Он полностью поддерживается последними версиями Hibernate.

0 голосов
/ 05 октября 2018

Вы устанавливаете 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...