2015-05-13 13 views
17

Rozumiem, że przy wiosennych danych JPA nie mogę mieć metody zapytania, aby pobrać wszystkie wiersze, w których kolumna jest równa nieokreślonemu parametrowi metody i użyć tej samej metody do pobrania wszystkich wiersze, w których ta kolumna ma wartość NULL, gdy parametr method ma wartość null.Dane sprężyny JPA i parametry, które mogą być wartościami null

Czy to prawda?

Muszę więc rozróżnić to w moim kodzie JAVA i muszę użyć osobnej metody zapytań, jawnie prosząc o wartości null, jak w poniższym przykładzie?

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

... 

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

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

To źle, jeśli mam 4 parametry, które mogą być zerowe i będą musiały kodować 16 różnych metod zapytania.

+0

Ugh, to naprawdę duże ograniczenie Spring Data JPA (IMHO). –

Odpowiedz

10

Masz rację.

Złożono wniosek o wsparcie lepszej obsługi parametrów zerowych. https://jira.spring.io/browse/DATAJPA-121

W twoim przypadku radziłbym napisać implementację twojego repozytorium i użyć niestandardowego CriteriaQuery do obsługi twojego przypadku.

Ponadto można użyć @Query adnotacji ze składnią is null:

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

EDIT

Ponieważ dane Wiosna JPA 2.0, sprężyna obsługuje teraz @Nullable adnotacji. Może to być pomocne w obsłudze parametrów o wartości null.

Z documentation:

@Nullable - do wykorzystania na wartości parametru lub powrotnego, który może być null.

+2

Mam przedłużyć odpowiedź: Podczas korzystania z adnotacji Wiosenny danych JPA '@ Query', musisz użyć dwóch oddzielnych metod zapytania. Jeden do obsługi wartości pustych i jeden do wartości innych niż null. Ale przy użyciu metody zapytań, która jest analizowana przez analizator składni Spring (bez adnotacji '@ Query'), możliwe jest przetwarzanie wartości zerowych lub nie-zerowych za pomocą jednej metody! –

+0

Parametr @Query ': ma wartość null' nie działa. Nie działa z wyjątkiem, ale nawet jeśli nie, SQL traktuje wartości null jako nieznane. Zatem nieznany nie jest równy nieznanemu ... Zasadniczo 'null' nie jest równe' null' w SQL. – Stef

8

Wygląda na to, że Query by Example może być tym, czego potrzebujesz.

zapytaniu przykładzie jest nowością w Spring dane (since version Hopper, z kwietnia 2016), która pozwala na tworzenie prostych zapytań dynamicznych z fragmentu kodu

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

Methods count/findOne/findAll które mają wystąpienie org.springframework.data.domain.Example jako parametr (a niektóre z nich także pobierają parametry sortowania/paginacji) pochodzą z interfejsu org.springframework.data.repository.query.QueryByExampleExecutor<T>, który jest rozszerzony o interfejs org.springframework.data.jpa.repository.JpaRepository<T, ID extends Serializable>.

W skrócie, wszystkie instancje JpaRepository mają teraz te metody.

Powiązane problemy