JPQL-запрос

программное обеспечение ‹-m:n-> тег

Я хочу создать запрос для выбора всех программ, где tag.id = id

Я пишу:

TypedQuery query =
              Software.em().createQuery(
               "SELECT DISTINCT s FROM Software s INNER JOIN s.tags WHERE s.tags.id = :tagId",
               Software.class
              );
              query.setParameter("tagId", tagId);

в результате у меня есть:

Обнаружено исключение java.lang.IllegalArgumentException, org.hibernate.QueryException: незаконная попытка разыменования коллекции [software0_.id.tags] со ссылкой на свойство элемента [id] [SELECT DISTINCT s FROM models.Software s INNER JOIN s.tags WHERE s.tags.id = :tagId]

Как я мог это реализовать? а почему у меня такое исключение?


person ses    schedule 06.04.2011    source источник


Ответы (2)


Я думаю, проблема может заключаться в том, что в вашем заявлении отсутствует предложение FROM. Ошибка «Неожиданный токен: INNER» выдается, потому что ожидается FROM.

Попробуйте следующий запрос:

SELECT DISTINCT s FROM Software s INNER JOIN s.tags t WHERE t.id = :tagId
person Elvander    schedule 06.04.2011
comment
Я исправил. может быть, но когда я поставил FROM, я получил: java.lang.IllegalArgumentException было перехвачено, org.hibernate.QueryException: незаконная попытка разыменования коллекции [software0_.id.tags] со ссылкой на свойство элемента [id] [SELECT DISTINCT s FROM models.Software s INNER JOIN s.tags WHERE s.tags.id = :tagId] - person ses; 06.04.2011
comment
Попробуйте это: SELECT DISTINCT s FROM Software s INNER JOIN s.tags t WHERE t.id = :tagId. - person Elvander; 06.04.2011

Я бы попробовал с:

Query q = JPA.em().createQuery("SELECT DISTINCT s FROM Software s join fetch s.tags t WHERE t.id = :tagId");
q.setParameter("tagId", tagId);

Это должно работать.

person Pere Villega    schedule 06.04.2011