% Like% Query wiosną JpaRepository


110

Chciałbym napisać podobne zapytanie, JpaRepositoryale nic nie zwraca:

LIKE '%place%'-to nie działa.

LIKE 'place' działa świetnie.

Oto mój kod:

@Repository("registerUserRepository")
public interface RegisterUserRepository extendsJpaRepository<Registration,Long> {

    @Query("Select c from Registration c where c.place like :place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}

Odpowiedzi:


199

Wiosenne zapytanie JPA danych wymaga znaków „%”, a także znaku spacji występującego po likezapytaniu, np

@Query("Select c from Registration c where c.place like %:place%").

Por. http://docs.spring.io/spring-data/jpa/docs/current/reference/html .

Możesz @Querycałkowicie pozbyć się adnotacji, ponieważ wydaje się ona przypominać standardowe zapytanie (automatycznie implementowane przez sprężynowe proxy danych); tj. używając jednej linii

List<Registration> findByPlaceContaining(String place);

jest wystarczający.


23
Przydatne może być również zignorowanie wielkości liter w zapytaniu, używając: findByPlaceIgnoreCaseContaining (String place);
ilyailya

Na marginesie - nie możesz mieszać i dopasowywać%: param% z% param% wewnątrz tego samego zapytania. W przeciwnym razie aplikacja nawet się nie uruchomi.
RVP

Dziękuję Ci. Kiedyś pisałem like '%:place%'z 'i nie było żadnych wyników, ponieważ Hibernate sam dodaje 's do stringów.
Yamashiro Rion

To nie jest dobra reakcja i jest również potencjalnie niebezpieczna. Spring rozwiązał to za pomocą ContainingIgnoreCase, sprawdź moją odpowiedź poniżej.
Alexius DIAKOGIANNIS

99

W rzeczywistości w ogóle nie potrzebujesz @Queryadnotacji.

Możesz po prostu użyć następujących

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

Dla mnie to najlepsze rozwiązanie. Nie wiedziałem, że możesz używać IgnoreCase w połączeniu z Containing, nie ma tego w dokumentacji.
Wilson Campusano

1
A co w przypadku, gdy chcę użyć wielu kolumn? - Uważam, że @Query()to konieczność, prawda? Przy takim podejściu musiałbym zrobić, orże nie jest to właściwie odpowiednie rozwiązanie w tym przypadku:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

26

Możesz również zaimplementować podobne zapytania, używając słowa kluczowego „Containing” obsługiwanego przez Spring Data JPA .

List<Registration> findByPlaceContaining(String place);

20

W twoim przypadku możesz bezpośrednio użyć metod JPA. To jest jak poniżej:

Zawiera: wybierz ... jak%: miejsce%

List<Registration> findByPlaceContainingIgnoreCase(String place);

tutaj IgnoreCase pomoże ci wyszukać element z ignorowaniem przypadku.

Korzystanie z @Query w JPQL :

@Query("Select registration from Registration registration where 
registration.place LIKE  %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);

Oto kilka powiązanych metod:

  1. Lubić findByPlaceLike

    … Gdzie x.place jak? 1

  2. Zaczynając od findByPlaceStartingWith

    … Gdzie x.place jak? 1 (parametr powiązany z dołączonym%)

  3. EndingWith findByPlaceEndingWith

    … Gdzie x.place jak? 1 (parametr powiązany z dołączonym%)

  4. Zawierający findByPlaceContaining

    … Gdzie x.place jak? 1 (parametr powiązany w%)

Więcej informacji, zobacz ten link , ten link i to

Mam nadzieję, że to ci pomoże :)


6

Możesz mieć jedną alternatywę użycia symboli zastępczych jako:

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);

4

Spróbuj tego.

@Query("Select c from Registration c where c.place like '%'||:place||'%'")

Pomocne, jeśli używamy something=:placei another like %:place%w zapytaniu.
hong4rc

1

w funkcji wywołania używam: findByPlaceContaining("%" + place);

lub: findByPlaceContaining(place + "%");

lub: findByPlaceContaining("%" + place + "%");


1

odpowiedź brzmi dokładnie

-> `@Query (" wybierz u z kategorii u, gdzie u.categoryName, np.%: Input% ")
     Lista findAllByInput (@Param ("input") String input);

0

Znalazłem rozwiązanie bez @Query(właściwie próbowałem, które z nich jest „akceptowane”. Jednak nie zadziałało).

Muszę wrócić Page<Entity>zamiast List<Entity>:

public interface EmployeeRepository 
                          extends PagingAndSortingRepository<Employee, Integer> {
    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);
}

IgnoreCase część była kluczowa dla osiągnięcia tego!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.