2015-05-13 11 views
17

La mia comprensione è che con i dati di Spring JPA non è possibile avere un metodo di query per recuperare tutte le righe in cui una colonna equivale a un determinato parametro del metodo non nullo e utilizzare lo stesso metodo per recuperare tutto righe in cui questa colonna è NULL quando il parametro method è null.Dati primari JPA e parametri che possono essere nulli

È corretto?

Quindi devo distinguere questo nel mio codice JAVA e devo usare un metodo di query separato che richiede esplicitamente valori null, come nell'esempio qui sotto?

// Query methods 
List<Something> findByParameter(Parameter parameter); 
List<Something> findByParameterIsNull(); 

... 

List<Something> result = new ArrayList<>(); 

if (parameter == null) 
    result = findByParameterIsNull(); 
else 
    result = findByParameter(parameter); 

Che male, se ho 4 parametri che potrebbero essere nulli e dovrei codificare 16 diversi metodi di interrogazione.

+0

Ugh, questa è una limitazione molto grande di Spring Data JPA (IMHO). –

risposta

10

Hai ragione.

È stata effettuata una richiesta per supportare una migliore gestione dei parametri null. https://jira.spring.io/browse/DATAJPA-121

Nel tuo caso, ti suggerisco di scrivere l'implementazione del tuo repository e di utilizzare un numero personalizzato CriteriaQuery per gestire il tuo caso.

Inoltre è possibile utilizzare il @Query annotazioni con la sintassi is null:

@Query("[...] where :parameter is null" 
public List<Something> getSomethingWithNullParameter(); 

EDIT

Poiché i dati di primavera JPA 2.0, la primavera ora supporta l'annotazione @Nullable. Questo può essere utile per gestire i parametri nulli passati.

Dal documentation:

@Nullable - da utilizzare su un valore di parametro o di ritorno che può essere nullo.

+2

Ho esteso la risposta: Quando si utilizza l'annotazione JPA '@ Query' di dati Spring, è necessario utilizzare due metodi di query distinti. Uno per gestire valori nulli e uno per valori non nulli. Ma quando si utilizza un metodo di query che viene analizzato dal parser di dati Spring (senza annotazione '@ Query'), è possibile gestire valori nulli o non nulli con un metodo! –

+0

Il parametro @Query:: parametro null non funziona. Fallisce con un'eccezione, ma anche se non lo fosse, SQL considera i null come sconosciuti. Quindi sconosciuto non è uguale a sconosciuto ... Fondamentalmente 'null' non è uguale a' null' in SQL. – Stef

8

Sembra che Query by Example potrebbe essere quello che ti serve.

Query by Example è una nuova funzionalità in primavera dati (since version Hopper, fuori aprile 2016), che permette di creare query dinamiche semplici con un codice come questo

Person person = new Person();       
person.setFirstname("Dave");       

ExampleMatcher matcher = ExampleMatcher.matching()  
    .withIncludeNullValues();       

Example<Person> example = Example.of(person, matcher); 

personRepository.count(example); 
personRepository.findOne(example); 
personRepository.findAll(example); 

Metodi count/findOne/findAll che prendono un'istanza di org.springframework.data.domain.Example come parametro (e alcuni di essi prendono anche i parametri di ordinamento/impaginazione) vengono dall'interfaccia org.springframework.data.repository.query.QueryByExampleExecutor<T>, che viene estesa dall'interfaccia org.springframework.data.jpa.repository.JpaRepository<T, ID extends Serializable>.

In breve, tutte le istanze JpaRepository dispongono ora di questi metodi.

Problemi correlati