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
Другие вопросы по тегам