SpringData: возможно ли иметь подзапросы в аннотации запроса? - PullRequest
7 голосов
/ 16 марта 2012

Я хотел бы знать, возможно ли иметь подзапрос в аннотации @Query (org.springframework.data.jpa.repository.Query;)

Я получаю исключение QuerySyntaxException при первом парентезе подзапроса.

Вот мой запрос

@Query(value="select c1 from ComplaintModel c1, "
+ "(select c2.id, min(cb.termDate) minDate from ComplaintModel c2 "
+ "join c2.complaintBullets cb join cb.status s where s.code = ?1 "
+ "group by c2.id) tmp where c1.id = tmp.id order by tmp.minDate")

Спасибо!

Ответы [ 3 ]

9 голосов
/ 17 марта 2012

Нет, подзапрос в предложении select в запросе JPQL невозможен.

JPQL поддерживает подзапросы в предложениях WHERE и HAVING. Это может быть (как минимум) часть выражений ANY, SOME, ALL, IN, EXIST и, конечно, могут использоваться обычные условные выражения:

SELECT a
FROM A a
WHERE a.val = (SELECT b.someval 
               FROM B b 
               WHERE b.someotherval=3)
2 голосов
/ 19 августа 2016

Я получил ожидаемые результаты в Spring-data jpa с

public final static String FIND_BY_ID_STATE = "SELECT a FROM Table1 a RIGHT JOIN a.table2Obj b " +
                                              "WHERE b.column = :id" +
                                              "AND a.id NOT IN (SELECT c.columnFromA from a.table3Obj c where state = :state)";


@Query(FIND_BY_ID_STATE)
public List<Alert> findXXXXXXXX(@Param("id") Long id, @Param("state") Long state);

, где

Table2Obj и Table3Obj - это отображение отношений между сущностями Table1 и Table2, Table3 соответственно.

определено, как показано ниже.

@OneToMany(mappedBy = "xxx", fetch = FetchType.LAZY)
private Set<Table2> table2Obj = new HashSet<>();
0 голосов
/ 30 марта 2012

Содержимое аннотации @Query более или менее передается поставщику постоянных данных путем вызова EntityManager.createQuery(…). Поэтому все, что там разрешено, может быть использовано в @Query. AFAIK, JPQL (ко времени JPA 2.0) поддерживает подзапросы только для предложений EXISTS и IN.

...