2014-09-10 14 views
5

Quindi, in breve: è possibile impostare un parametro su "default: tutti" o più in generale su un valore specifico predefinito nei metodi di raccolta JPA (possibilmente @ Query-Annotated) di Spring Data?Repository JPA Data Spring: è possibile fornire un valore predefinito a tutti i parametri?

Sono aware che è possibile nei controller (Rest) impostare un valore predefinito, sono solo curioso di sapere se è possibile farlo anche a livello di repository. Potrebbe essere una bella caratteristica, penso che, per "ottenere un risultato filtrato, Setet dove i filtri potrebbero non essere impostati in frontend da una chiamata di riposo" è un caso d'uso molto comune.

Esempio-Query:

@Query("select new com.my.dto(e.name, e.age, e.address)" + 
     " from Entity e" + 
     "where e.name like ?1 " + 
     "and e.age like ?2 " + 
     "and e.street like ?3") 
List<Item> findItemsFiltered(String name, String age, String street); 

Così, quando diciamo che strada non è impostata, il Repository dovrebbe usare "%" per tornare tutti i risultati in cui gli altri criteri è la corrispondenza, ma la strada non è rilevante.

+2

Quello sarebbe diventato imho disordinato. Invece probabilmente stai meglio con un 'Specification' che costruisce la query dinamica (che è ciò che fondamentalmente vuoi). Vedi anche http://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/ –

+0

Si potrebbe anche voler controllare la guida di riferimento -> http: // docs. spring.io/spring-data/jpa/docs/current/reference/html/#specifications –

+1

suona come una soluzione valida, grazie ancora :) Ho pensato solo per il caso d'uso comune "ripiega per selezionare tutto se no valore definito ", ci sarebbe un modo un po 'più semplice per farlo". Sarebbe bello avere qualcosa di semplice qui, pensando ad altre query che hanno una lista di valori filtro come 'where e.group IN? 3' (non puoi usare"% "qui). Ma bene, grazie finora. Se vuoi, crea una risposta dal tuo commento. Aspetterò ancora altre risposte, ma come detto, è una soluzione valida :-) – Dominik

risposta

0

Che ne dici di farlo nello stesso @Query? Qualcosa di simile:

@Query("select new com.my.dto(e.name, e.age, e.address)" + 
    " from Entity e" + 
    "where e.name like ?1 " + 
    "and e.age like ?2 " + 
    "and e.street like (CASE WHEN ?3 IS NULL THEN '%' ELSE ?3 END)") 
List<Item> findItemsFiltered(String name, String age, String street); 

Un altro modo sarebbe quello di avere un'annotazione parametro personalizzato come @Default ma che avrebbe richiesto la personalizzazione l'attuazione repository stesso credo.

Un'altra alternativa è la Specification come menzionato da M. Deinum.

Problemi correlati