2012-03-16 74 views
5

Me gustaría saber si es posible tener subconsulta en una anotación de @Query (org.springframework.data.jpa.repository.Query;)SpringData: ¿es posible tener subconsultas en la anotación de consulta?

estoy recibiendo un QuerySyntaxException en el primer parentesis subconsulta.

Aquí es mi consulta

@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") 

Gracias!

+1

No se trata de Spring Data, también creo que no se puede hacer esto en JPQL. –

Respuesta

6

No, no es posible tener subconsulta en la cláusula de selección en la consulta JPQL.

JPQL admite subconsultas en WHERE y cláusulas HAVING. Puede ser (por lo menos) parte de cualquier, algunos, todos, IN, existen expresiones, y por supuesto se pueden utilizar las expresiones condicionales normales:

SELECT a 
FROM A a 
WHERE a.val = (SELECT b.someval 
       FROM B b 
       WHERE b.someotherval=3) 
0

El contenido de la @Query anotación es más o menos pasa como es para el proveedor de persistencia llamando al EntityManager.createQuery(…). Entonces, lo que está permitido allí se puede usar en @Query. AFAIK, JPQL (en el momento de JPA 2.0) solo admite subconsultas para las cláusulas EXISTS y IN.

+0

JPA 2.0 admite subconsultas en WHERE y cláusulas HAVING. En esos se pueden usar en muchos tipos de expresiones, incluyendo EXISTS e IN. –

1

Me dio los resultados esperados en JPA-primavera de datos con

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); 

donde

Table2Obj & Table3Obj son el mapeo de la relación entre las entidades de la Tabla 1 y Tabla 2, Tabla 3, respectivamente.

definido Como a continuación.

@OneToMany(mappedBy = "xxx", fetch = FetchType.LAZY) 
private Set<Table2> table2Obj = new HashSet<>(); 
Cuestiones relacionadas