2017-05-04 16 views
9

Chcę mieć interfejs repozytorium danych sprężynowych, który pobiera dwa parametry. Czy istnieje sposób, aby sprawić, by miało ono następujące zachowanie?Dane sprężyny - ignoruj ​​parametr, jeśli ma wartość pustą

MyObject findByParameterOneAndParameterTwo(String parameterOne, String parameterTwo); 

Jeśli oba parametry mają wartość, chciałbym aby zachowywała się normalnie i wykonywała "AND" dla obu wartości.

Jeśli na przykład drugi parametr jest null, wtedy byłoby szukać tylko ParameterOne

Wszelkie sugestie?

+1

Mechanizm wyprowadzania zapytania z nazwy metody repozytorium podanej przez Spring Data jest przeznaczony dla przypadków, w których zapytanie jest znane z góry. Nie można oczekiwać, że mechanizm ten będzie działał z zapytaniami, które są dokładnie znane tylko w czasie wykonywania. W przypadku sytuacji dynamicznych istnieje kilka innych opcji, takich jak '@ Query' i QueryDSL. SQL i JPA obsługują funkcję 'COALESCE', która może być użyta do obejścia parametru, który czasami może mieć wartość' NULL'. '@Query (" SELECT e FROM MyObject i WHERE COALESCE (e.parameterOne,? 1) =? 1 AND COALESCE (e.parameterOne,? 2) =? 2 ")' powinno działać. – manish

+1

@manish Myślę, że 'COALESCE (? 1, e.parameterOne) = e.parameterOne' jest twoją intacją. – Blank

+0

@Forward, podałem tylko kierunek plakatu, ponieważ nie jestem pewien, w jaki sposób plakat chce, aby dopasowanie dokładnie działało. Na przykład nie określono, czy baza danych może zawierać wartości "null" dla tych kolumn, a jeśli tak, to w jaki sposób powinno pasować, i tak dalej. Ale tak, w oparciu o to, co zostało opublikowane, twój komentarz jest trafny. – manish

Odpowiedz

6

nie jestem pewien, że jest to możliwe za pomocą metod repozytorium nazewnictwa, ale można użyć @Query jak

(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo) 
+1

Może 'isnull' powinno zostać zmienione na' is null'? – Searene

+0

@Searene, tak, masz rację –

5

Obecnie nie jest to możliwe w Spring-data-jpa.

Jest JIRAticket w odniesieniu do tego, który jest nadal pod dochodzenia przez zespół Spring.

Jeśli jednak chcesz obejść ten problem, możesz wypróbować proste zapytanie o przykład: here.

0

Nie jestem pewien, czy jest to możliwe, używając Repo jako oddzielnej klasy, ale można użyć zapytania Append StringBuilder z parametrem opcji. To na pewno zadziała

StringBuilder queryBuilder = new StringBuilder(); 
    queryBuilder.append("select p.name from personDemographic p "); 
    Boolean flag = true; 
    if(parameterOne != null){ 
     if(flag){ 
      queryBuilder.append("where condition..."); 
      flag=false; 
     } 
     } 
    if(parameterOne != null){ 
    if(flag){ 
    queryBuilder.append("where condition..."); 
    flag = false; 
    }else{ 
     queryBuilder.append("and condition..."); 
    } 
    Query query = entityManager.createQuery(queryBuilder.toString()); 
Powiązane problemy