JPQL-запрос с WHERE на вложенные поля
У меня есть класс сущности Java UserBean со списком событий:
@OneToMany
private List<EventBean> events;
EventBean имеет переменную Date:
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date eventDate;
Теперь в UserBean я хочу создать NamedQuery, который возвращает все даты, попадающие в определенный диапазон:
@NamedQuery(name="User.findEventsWithinDates",
query="SELECT u.events FROM UserBean u WHERE u.name = :name AND u.events.eventDate > :startDate AND u.events.eventDate < :endDate")
Вышеупомянутый запрос не компилируется, хотя. Я получаю эту ошибку:
The state field path 'u.events.eventDate' cannot be resolved to a valid type.
Кстати, я использую EclipseLink версии 2.5.0.v20130507-3faac2b.
Что я могу сделать, чтобы этот запрос работал? Благодарю.
1 ответ
Дорожка u.events.eventDate
является недопустимой конструкцией в JPQL, потому что не разрешается перемещаться по выражению пути с коллекцией. В этом случае u.events
является коллекционным выражением пути В спецификации JPA 2.0 это сказано следующими словами:
Синтаксически незаконно составлять выражение пути из выражения пути, которое оценивается в коллекцию. Например, если o обозначает Order, выражение пути o.lineItems.product является недопустимым, поскольку переход к lineItems приводит к коллекции. Этот случай должен привести к ошибке при проверке строки запроса. Для обработки такой навигации переменная идентификации должна быть объявлена в предложении FROM, чтобы охватывать элементы коллекции lineItems.
Эта проблема может быть решена с помощью JOIN:
SELECT distinct(u)
FROM UserBean u JOIN u.events e
WHERE u.name = :someName
AND e.eventDate > :startDate
AND e.eventDate < :endDate