Próbuję stworzyć metodę w CrudRepository, która będzie w stanie podać mi listę użytkowników, których nazwy użytkowników są TAKIE JAK parametr wejściowy (nie tylko zaczynają się, ale również zawierają). Próbowałem użyć metody, "findUserByUsernameLike(@Param("username") String username)"
ale jak jest powiedziane w dokumentacji Spring, ta metoda jest równa " where user.username like ?1
". Nie jest to dla mnie dobre, ponieważ już powiedziałem, że próbuję zdobyć wszystkich użytkowników, których nazwa użytkownika zawiera ...
Napisałem zapytanie do metody, ale ona nawet się nie wdraża.
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
@Query("select u from user u where u.username like '%username%'")
List<User> findUserByUsernameLike(@Param("username") String username);
}
Czy ktoś może mi w tym pomóc?
containing
, aby skorzystać z indeksów, patrz docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/…Odpowiedzi:
Spróbuj zastosować następujące podejście (u mnie działa):
@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')") List<String> findUsersWithPartOfName(@Param("username") String username);
Uwaga: nazwa tabeli w JPQL musi zaczynać się wielką literą.
źródło
WHERE UPPER(u.username) LIKE CONCAT('%',UPPER(:username),'%')
do wyszukiwania bez rozróżniania wielkości liter@Param
są odkażone, więc nie.Korzystanie z Like:
select ... like :username
List<User> findByUsernameLike(String username);
Począwszy od:
select ... like :username%
List<User> findByUsernameStartingWith(String username);
Kończące się:
select ... like %:username
List<User> findByUsernameEndingWith(String username);
Zawierający:
select ... like %:username%
List<User> findByUsernameContaining(String username);
Zwróć uwagę, że odpowiedź, której szukasz, to numer 4 . Nie musisz używać @Query
źródło
List<User> findByUsernameContainingIgnoreCase(String username);
StartingWith: select ... like :username%
iEndingWith: select ... like %:username
... w każdym razie świetna odpowiedź ... powinna być akceptowana. Dzięki.Inny sposób: zamiast
CONCAT
funkcji możemy użyć podwójnej kreski:: lastname || „%”@Query("select c from Customer c where c.lastName LIKE :lastname||'%'") List<Customer> findCustomByLastName( @Param("lastname") String lastName);
Możesz wstawić dowolne miejsce, prefiks, sufiks lub oba
:lastname ||'%' '%' || :lastname '%' || :lastname || '%'
źródło
List<User> findByUsernameContainingIgnoreCase(String username);
aby zignorować problemy ze sprawami
źródło
W twoim przypadku możesz bezpośrednio użyć metod JPA. To jest jak poniżej:
Zawiera: wybierz ... jak%: nazwa użytkownika%
List<User> findByUsernameContainingIgnoreCase(String username);
tutaj IgnoreCase pomoże ci wyszukać element z ignorowaniem przypadku.
Oto kilka powiązanych metod:
Lubić
findByFirstnameLike
… Gdzie x.firstname jak? 1
Zaczynając od
findByFirstnameStartingWith
… Gdzie x.firstname jak? 1 (parametr powiązany z dołączonym%)
EndingWith
findByFirstnameEndingWith
… Gdzie x.firstname jak? 1 (parametr powiązany z przedrostkiem%)
Zawierający
findByFirstnameContaining
… Gdzie x.firstname jak? 1 (parametr powiązany z%)
Więcej informacji, zobacz ten link i ten link
Mam nadzieję, że to ci pomoże :)
źródło
Łatwy w użyciu (nie ma potrzeby używania CONCAT lub ||):
@Query("from Service s where s.category.typeAsString like :parent%") List<Service> findAll(@Param("parent") String parent);
Dokumentacja: http://docs.spring.io/spring-data/jpa/docs/current/reference/html .
źródło
Ten sposób działa dla mnie (używając Spring Boot w wersji 2.0.1. RELEASE):
@Query("SELECT u.username FROM User u WHERE u.username LIKE %?1%") List<String> findUsersWithPartOfName(@Param("username") String username);
Wyjaśnienie:? 1,? 2,? 3 itd. To symbole zastępcze pierwszego, drugiego, trzeciego parametru itd. W tym przypadku wystarczy, aby parametr był otoczony przez%, tak jakby to było standardowe zapytanie SQL, ale bez pojedyncze cytaty.
źródło
@Query("SELECT u.username FROM User u WHERE u.username LIKE %:username%")
@Query("select u from user u where u.username LIKE :username") List<User> findUserByUsernameLike(@Param("username") String username);
źródło
@Query("select b.equipSealRegisterId from EquipSealRegister b where b.sealName like %?1% and b.deleteFlag = '0'" ) List<String>findBySeal(String sealname);
Wypróbowałem ten kod i działa.
źródło