2013-09-09 2 views
7

У меня есть класс UserBean ява сущности со списком событий:JPQL запрос с WHERE на вложенных полях

@OneToMany 
private List<EventBean> events; 

EventBean имеет Дата переменную:

@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.

Что можно сделать, чтобы выполнить этот запрос? Благодарю.

ответ

12

Путь u.events.eventDate является незаконной конструкцией в JPQL, потому что ей не разрешено перемещаться по выражению коллекции с оценкой. В этом случае u.events - это выражение с оценкой коллекции. В JPA спецификации 2.0 это сказано со следующими словами:

It is syntactically illegal to compose a path expression from a path expression that evaluates to a collection. For example, if o designates Order, the path expression o.lineItems.product is illegal since navigation to lineItems results in a collection. This case should produce an error when the query string is verified. To handle such a navigation, an identification variable must be declared in the FROM clause to range over the elements of the lineItems collection.

Эта проблема может быть решена с помощью JOIN:

SELECT distinct(u) 
FROM UserBean u JOIN u.events e 
WHERE u.name = :someName 
     AND e.eventDate > :startDate 
     AND e.eventDate < :endDate 
+0

Спасибо, что работает! Я только хочу выбрать s пользователя с определенным именем. Поэтому я подумал, что если я добавлю «WHERE u.name =: name», прежде чем оператор JOIN сделает именно это. Я получаю эту ошибку: Выражение не является допустимым условным выражением. Что было бы условным условным выражением для выбора пользователя по имени? – user473453

+0

Добавлено: имя для ответа. Такое условие относится к существующему предложению WHERE - дополнительные предложения WHERE перед операцией JOIN невозможны. –

+0

Yay, это сделал. Окончательный запрос: SELECT DISTINCT u.events ИЗ UserBean у РЕГИСТРИРУЙТЕСЬ u.events е WHERE u.name =: имя И e.eventDate>: STARTDATE И e.eventDate <: ENDDATE Спасибо большое за помощь , Я довольно новичок в JPA, это самый эффективный способ получить нужные мне данные из базы данных? Похоже, что запрос выполняется медленно, но причиной этого может быть медленное подключение к Интернету. – user473453

Смежные вопросы