2015-05-13 6 views
17

Mein Verständnis ist, dass mit Spring-Daten JPA Ich kann keine Abfrage-Methode zum Abrufen aller Zeilen, wo eine Spalte einem bestimmten Nicht-Null-Methode Parameter entspricht und die gleiche Methode verwenden, um alle abzurufen Zeilen, in denen diese Spalte NULL ist, wenn der Methodenparameter null ist.Spring Daten JPA und Parameter, die Null sein können

Ist das korrekt?

Also muss ich das in meinem JAVA-Code unterscheiden und ich muss eine separate Abfrage-Methode explizit für Null-Werte verwenden, wie im folgenden Beispiel?

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

... 

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

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

Das ist schlecht, wenn ich 4 Parameter habe, die null sein könnten und 16 verschiedene Abfragemethoden codieren müssten.

+0

Ugh, das ist eine wirklich große Einschränkung von Spring Data JPA (IMHO). –

Antwort

10

Sie haben Recht.

Es wurde eine Anfrage gestellt, um eine bessere Behandlung von Nullparametern zu unterstützen.

In Ihrem Fall würde ich Ihnen raten, Ihre Repository-Implementierung zu schreiben und eine benutzerdefinierte CriteriaQuery zu verwenden, um Ihren Fall zu behandeln.

Auch können Sie die @Query Annotation mit der is null Syntax:

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

EDIT

Da Daten Feder JPA 2.0, Feder unterstützt jetzt @Nullable Anmerkung. Dies kann hilfreich sein, um übergebene Nullparameter zu behandeln.

Vom documentation:

@Nullable - auf einem Parameter oder Rückgabewert verwendet werden, die null sein kann.

+2

Ich habe die Antwort erweitert: Wenn Sie die Spring-Daten JPA '@ Query' Annotation verwenden, müssen Sie zwei separate Abfrage-Methoden verwenden. Eine für die Behandlung von Nullwerten und eine für Nicht-Null-Werte. Wenn Sie jedoch eine Abfragemethode verwenden, die vom Spring-Datenparser analysiert wird (ohne die Annotation @ @ Query), können Sie mit einer Methode Null- oder Nicht-Null-Werte verarbeiten! –

+0

Der Parameter @Query ': ist null' funktioniert nicht. Es schlägt mit einer Ausnahme fehl, aber selbst wenn dies nicht der Fall wäre, behandelt SQL Nullen als unbekannt. Also ist unbekannt nicht gleich unbekannt ... Grundsätzlich ist 'null' in SQL nicht gleich 'null'. – Stef

8

Es scheint Query by Example könnte was Sie brauchen.

Query by Example ist ein neues Feature in Spring Data (since version Hopper, aus April 2016), die eine einfache dynamische Abfragen mit einem Code wie folgt

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

Methoden count/findOne/findAll, die nehmen eine Instanz von org.springframework.data.domain.Example erstellen können als Parameter (und einige von ihnen auch Sortieren/Seitenumbruch Parameter) kommen von org.springframework.data.repository.query.QueryByExampleExecutor<T> Schnittstelle, die durch org.springframework.data.jpa.repository.JpaRepository<T, ID extends Serializable> Schnittstelle erweitert wird.

Kurz gesagt, alle JpaRepository Instanzen haben jetzt diese Methoden.

Verwandte Themen