it-swarm.com.de

Spring JPA @Query mit LIKE

Ich versuche, eine Methode in CrudRepository zu erstellen, die mir eine Liste von Benutzern geben kann, deren Benutzernamen LIKE der Eingabeparameter sind (nicht nur mit beginnen, sondern auch enthalten). Ich habe versucht, die Methode "findUserByUsernameLike(@Param("username") String username)" zu verwenden, aber wie in der Spring-Dokumentation beschrieben, ist diese Methode gleich __. "where user.username like ?1". Es ist nicht gut für mich, da ich bereits sagte, dass ich versuche, alle Benutzer zu erhalten, deren Benutzername ... 

Ich habe eine Abfrage für die Methode geschrieben, die jedoch nicht implementiert wird.

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

Kann mir jemand dabei helfen?

45
Viktoriia

Versuchen Sie den folgenden Ansatz (es funktioniert für mich):

@Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')")
List<String> findUsersWithPartOfName(@Param("username") String username);

Hinweis: Der Tabellenname in JPQL muss mit einem Großbuchstaben beginnen.

96
Mark

Verwenden Sie Abfrageerstellung aus Methodennamen , überprüfen Sie Tabelle 4, wo sie einige Schlüsselwörter erklären.

  1. Like Like: select ... wie: Benutzername

    List<User> findByUsernameLike(String username);
    
  2. StartingWith: select ... wie: Benutzername%

    List<User> findByUsernameStartingWith(String username);
    
  3. EndingWith: select ... wie%: Benutzername

    List<User> findByUsernameEndingWith(String username);
    
  4. Enthalten: auswählen ... wie%: Benutzername%

    List<User> findByUsernameContaining(String username);
    

Beachten Sie, dass die Antwort, nach der Sie suchen, number 4 ist. Sie müssen @Query nicht verwenden

79
jmgoyesc

Eine andere Möglichkeit: Statt CONCAT können wir double pipe verwenden:: lastname || '%'  

@Query("select c from Customer c where c.lastName LIKE :lastname||'%'")
List<Customer> findCustomByLastName( @Param("lastname") String lastName);

Sie können eine beliebige Stelle, ein Präfix, ein Suffix oder beides einfügen 

:lastname ||'%'  
'%' || :lastname  
'%' || :lastname || '%'  
19
remat_br

List<User> findByUsernameContainingIgnoreCase(String username);

um Fallprobleme zu ignorieren

7
Yusuf

Einfach zu bedienen (keine Notwendigkeit CONCAT oder ||):

@Query("from Service s where s.category.typeAsString like :parent%")
List<Service> findAll(@Param("parent") String parent);

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

4
Míra

In Ihrem Fall können Sie JPA-Methoden direkt verwenden. Das ist wie unten:

Containing: select ... wie%: Benutzername%

List<User> findByUsernameContainingIgnoreCase(String username);

IgnoreCase hilft Ihnen dabei, nach Elementen zu suchen, bei denen der Fall ignoriert wird.

Hier einige verwandte Methoden:

  1. LikefindByFirstnameLike

    … Wo x.Fername wie? 1

  2. StartingWithfindByFirstnameStartingWith

    … Wo x.Erstname wie? 1 (Parameter mit angehängtem% gebunden)

  3. EndingWithfindByFirstnameEndingWith

    … Wo x.Firstname wie? 1 (Parameter mit vorangestelltem% gebunden)

  4. EnthältfindByFirstnameContaining

    … Wo x.Firstname wie? 1 (Parameter gebunden in%)

Mehr Infos, sehen Sie diesen Link und diesen Link

Hoffe das hilft dir :)

3
@Query("select u from user u where u.username LIKE :username")
List<User> findUserByUsernameLike(@Param("username") String username);
0
Mannekenpix

Dieser Weg funktioniert für mich (mit Spring Boot Version 2.0.1. RELEASE):

@Query("SELECT u.username FROM User u WHERE u.username LIKE %?1%")
List<String> findUsersWithPartOfName(@Param("username") String username);

Erläutern: Die Zeichen? 1,? 2,? 3 usw. sind Platzhalter für den ersten, zweiten, dritten Parameter usw. In diesem Fall reicht es aus, wenn der Parameter von% umgeben ist, als wäre es eine Standard-SQL-Abfrage, jedoch ohne Einzelzitate.

0
Uisleandro