2012-04-23 25 views
10

Estoy utilizando Spring Data JPA y estoy tratando de agregar una consulta a mi repositorio. Yo estaba tratando de construir simplemente la consulta sin la anotación @Query como:Spring JPA Data "O" consulta

List<Item> findByTypeAndStateOrStateAndStartDateBetween(Type type, State s, State s2, Date startDate, Date endDate); 

Mi objetivo es construir una consulta de este modo:

select * from item where type = ? and (state = ? or state = ?) and start_date between ? and ? 

Mi problema es con la cláusula OR. ¿Hay alguna manera de asegurarse de que haya corchetes? De lo contrario, la lógica no es correcta. Los ejemplos que encontré aquí: http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.M1/reference/html/#jpa.query-methods.query-creation

no tienen ninguna o cláusula con más de 1 columna.

Además, hay una manera de pasar en una lista de objetos. Por ejemplo, si quisiera encontrar elementos con 3 estados, tendría que crear otra consulta, que no se escala muy bien.

Gracias.

EDIT:

me di cuenta de cómo pasar de la lista de estados que utilizan la notación @Query. Lo hace así:

@Query("FROM item i WHERE i.type = ?1 AND i.state IN (?2)") 

Luego puede simplemente pasar una lista al método como el segundo parámetro. Todavía no sé cómo hacer esto sin usar la notación @Query.

+3

Creo que esta es la razón por la primavera de datos le permite especificar la consulta, sólo puede ir tan lejos en la determinación de lo que quiere de nombre de método solo. Está bien para consultas simples, pero una vez que aumenta la complejidad, es mejor que le diga exactamente lo que quiere en lugar de adivinarlo. – Thevenin

+0

Además, @Query es mucho más fácil de leer que un nombre de método largo. – skel625

+0

Gracias, esta es la conclusión a la que llegué también. Solo usa un @Query. – devo

Respuesta

1

Bueno, estás muy cerca. Para hacer esto sin @Query la In o IsIn palabra clave puede ser utilizado (no estoy seguro si estas palabras clave se apoyaron en el momento en que se hizo la pregunta):

List<Item> findByTypeAndStateInAndStartDateBetween(Type type, Collection<State> states, Date startDate, Date endDate); 

In y NOTIN también tomar cualquier subclase de colección como parámetro también como matrices o varillas. Para otras versiones sintácticas del mismo operador lógico , marque Repository query keywords.

Esto bastará con su necesidad de pasar cualquier número de estados para los criterios de operación.

Referencia: Tabla 4. palabras clave soportados dentro de los nombres de métodos en Query creation docs

+0

Gracias. Estas palabras clave no estaban disponibles cuando hice esta pregunta. – devo

2

Quería hacer lo mismo con obtener todos los datos para una estación en particular, eso fue entre dos fechas.

findByStartdateBetweenOrEnddateBetweenAndStation(start,end,start,end,station) 
Gives you ==> 
SELECT...WHERE (startdate between start,end) OR (enddatebetween start,end AND station=station) 

Y:

findByStationAndStartdateBetweenOrEnddateBetween(station, start,end,start,end) 
Gives you ==> 
SELECT...WHERE (station=station AND startdate between start,end) OR enddatebetween start,end 

Ambos están equivocados, ya que quería:

SELECT...WHERE station=station AND (startdate between start,end OR enddatebetween start,end) 

Uso del @Query que ser muy específico y no se arriesgue su mezcla y/o con el nombre del método.

Cuestiones relacionadas