java jpql запрос с 2 параметрами

#java #jpql

#java #jpql

Вопрос:

У меня проблема с запросом jpql с 2 параметрами:

это запрос:

 public List<OrganizedUe> findByAcademicYear(Date start, Date end)
    {        
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
        String startFormat = format1.format(start.getTime());
        String endFormat = format1.format(end.getTime());            
        List<OrganizedUe> list;
        String queryString = 
        "SELECT o FROM OrganizedUe o "
                  "WHERE o.startDate >= :param1 "
                  "AND "
                  "o.endDate <= :param2 "
                  "ORDER BY o.startDate";
        Query q = em.createQuery(queryString);
        q.setParameter("param1", startFormat);
        q.setParameter("param2", endFormat);
        list = q.getResultList();
        return list;
    }
  

Если я запускаю эту функцию, я получаю сообщение об ошибке от браузера:

Вызвано: java.lang.Исключение IllegalArgumentException: Вы пытались установить значение типа class java.lang.Строка для параметра param1 с ожидаемым типом класса java.util.Дата из строки запроса ВЫБИРАЕТСЯ o ИЗ OrganizedUe o, ГДЕ o.StartDate >= :param1 И o.EndDate <= :param2 УПОРЯДОЧИВАЮТСЯ По o.StartDate.

Странная вещь, я посмотрел значение в режиме отладки для StartDate и endFormat, и строка 2 имеет значение типа YY-MM-DD, но в соответствии с ошибкой я должен отправить дату?

Я провел другой тест, в котором я жестко запрограммировал:param1 и: param2 в этом формате: ‘2014-09-15’, и в этом случае моя функция работает.

Есть ли у вас представление о том, в чем может быть проблема?

Спасибо

Редактировать:

это определение начала и конца в моей сущности OrganizedUe:

 @Basic(optional = false)
@NotNull
@Column(name = "start_date")
@Temporal(TemporalType.DATE)
private Date startDate;
@Basic(optional = false)
@NotNull
@Column(name = "end_date")
@Temporal(TemporalType.DATE)
private Date endDate;
  

Комментарии:

1. Пожалуйста, покажите, как вы определили startDate и endDate в вашей сущности OrganizedUe

2. Привет, Николас, добавленный в исходное сообщение

Ответ №1:

Вместо преобразования в строку просто используйте переменные date вместо:

 q.setParameter("param1", start);
q.setParameter("param2", end);
  

Если вам нужно начать с первой даты и закончить со второй (как весь день), вы можете установить их в начале / конце дня:

 start.setHour(0);
end.setHour(23);
start.setMinutes(0);
end.setMinutes(59);
// and the same for seconds :)
  

Просто чтобы установить время в 0:00:00 при запуске и 23: 59:59 в конце.