#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 в конце.