2014-01-30 7 views
30

Ich versuche, eine Methode in CrudRepository zu machen, die mir in der Lage, Liste der Benutzer zu geben, der Benutzername LIKE Eingangsparameter sind (nur nicht mit, beginnen aber enthält es auch). Ich habe versucht, Methode "findUserByUsernameLike(@Param("username") String username)" zu verwenden, aber wie es im Frühjahr Dokumentation gesagt wird, ist diese Methode gleich "where user.username like ?1". Es ist nicht gut für mich, wie ich schon gesagt, dass ich versuche, alle Benutzer, deren Benutzernamen enthält zu bekommen ...Frühling JPA @Query mit LIKE

ich ein queryto die Methode geschrieben, aber es ist noch nicht einsetzen.

@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?

+4

Sie könnten 'containing' verwenden, um von Indizes zu profitieren, siehe http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/repository-query -keywords.html –

Antwort

55

Versuchen Sie, verwenden 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.

+1

oder WHERE UPPER (u.username) LIKE CONCAT ('%', UPPER (: username), '%') 'eine Groß- und Kleinschreibung Suche –

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

Danke, war das Problem der deplouing dass JPQL Groß- und Kleinschreibung, jetzt ist es die Bereitstellung, sondern ‚LIKE‘ funktioniert nicht wie ich will. Es findet nur Datensätze, die dem Eingabeparameter vollständig entsprechen (ohne es zu enthalten). – Viktoriia

14

Ein anderer Weg: stattdessen CONCAT Funktion können wir Doppelrohr verwenden: : Nachname || '%'

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

Sie überall setzen können, Präfix, Suffix oder beide

:lastname ||'%' 
'%' || :lastname 
'%' || :lastname || '%' 
+0

Eine schöne und prägnante Lösung. – Burt

47

Mit Query creation from method names, überprüfen Tabelle 4, wo sie einige Schlüsselwörter erklären.

  1. Verwendung wie: wählen Sie ... wie: Benutzername

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

    List<User> findByUsernameStartingWith(String username); 
    
  3. EndingWith: wählen .. . wie: username%

    List<User> findByUsernameEndingWith(String username); 
    
  4. mit einem Gehalt: wählen Sie ... wie%: username%

    List<User> findByUsernameContaining(String username); 
    

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

+1

Super, das sollte akzeptiert werden Antwort! toller Typ. – Dev

+0

Yup, das ist eine richtige Antwort. – khartvin

+0

Das ist wirklich hilfreich, aber wenn ich das Containing-Schlüsselwort verwenden möchte, kann ich auch die Groß-/Kleinschreibung beachten? In der Dokumentation wird etwas über StringMatcher gesagt. Es scheint, wenn ich eine separate Funktion mit ExampleMatcher erstellen würde, würde es funktionieren, aber kann ich es irgendwie im Methodennamen erklären, nicht meine eigene Funktion nur für das Hinzufügen dieser Groß-/Kleinschreibung zu schreiben? –

-1
@Query("select b.equipSealRegisterId from EquipSealRegister b where b.sealName like %?1% and b.deleteFlag = '0'") 
    List<String>findBySeal(String sealname); 

Ich habe diesen Code ausprobiert und es funktioniert.

6

List<User> findByUsernameContainingIgnoreCase(String username);

um Fall zu ignorieren, gibt