Ich versuche, eine Methode in CrudRepository zu erstellen, die mir eine Liste von Benutzern geben kann, deren Benutzernamen WIE der Eingabeparameter sind (nicht nur damit beginnen, sondern ihn auch enthalten). Ich habe versucht, die Methode zu verwenden, "findUserByUsernameLike(@Param("username") String username)"
aber wie in der Spring-Dokumentation angegeben, ist diese Methode gleich " where user.username like ?1
". Es ist nicht gut für mich, da ich bereits gesagt habe, dass ich versuche, alle Benutzer zu finden, deren Benutzername ...
Ich habe eine Abfrage zu der Methode geschrieben, die jedoch nicht bereitgestellt 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?
containing
um von Indizes zu profitieren, siehe docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/…Antworten:
Versuchen Sie, den folgenden Ansatz zu verwenden (er funktioniert bei mir):
Hinweis: Der Tabellenname in JPQL muss mit einem Großbuchstaben beginnen.
quelle
WHERE UPPER(u.username) LIKE CONCAT('%',UPPER(:username),'%')
um eine Suche ohne@Param
s sind bereinigt, also nein.Verwenden von Like: Wählen Sie ... like: Benutzername
StartingWith: select ... like: Benutzername%
EndingWith: Wählen Sie ... wie%: Benutzername
Enthält: Wählen Sie ... wie%: Benutzername%
Beachten Sie, dass die gesuchte Antwort Nummer 4 ist . Sie müssen @Query nicht verwenden
quelle
List<User> findByUsernameContainingIgnoreCase(String username);
StartingWith: select ... like :username%
undEndingWith: select ... like %:username
... trotzdem eine gute Antwort ... sollte die akzeptierte sein. Vielen Dank.Ein anderer Weg: Stattdessen
CONCAT
können wir Double Pipe verwenden :: lastname || '%'Sie können überall ein Präfix, Suffix oder beides einfügen
quelle
List<User> findByUsernameContainingIgnoreCase(String username);
um Fallprobleme zu ignorieren
quelle
Einfach zu bedienen (CONCAT oder || müssen nicht verwendet werden):
Dokumentiert in: http://docs.spring.io/spring-data/jpa/docs/current/reference/html .
quelle
Für Ihren Fall können Sie direkt JPA-Methoden verwenden. Das ist wie unten:
Enthält: Wählen Sie ... wie%: Benutzername%
Hier hilft Ihnen IgnoreCase bei der Suche nach Elementen, wobei der Fall ignoriert wird.
Hier sind einige verwandte Methoden:
Mögen
findByFirstnameLike
… Wo x.firstname wie? 1
Beginnen mit
findByFirstnameStartingWith
… Wo x.firstname wie? 1 (Parameter mit angehängtem% gebunden)
EndingWith
findByFirstnameEndingWith
… Wo x.firstname wie? 1 (Parameter mit vorangestelltem% gebunden)
Enthält
findByFirstnameContaining
… Wo x.firstname wie? 1 (Parameter in% eingeschlossen)
Weitere Informationen finden Sie unter diesem Link und diesem Link
Hoffe das wird dir helfen :)
quelle
Dieser Weg funktioniert bei mir (mit Spring Boot Version 2.0.1. RELEASE):
Erklären: Die? 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.
quelle
@Query("SELECT u.username FROM User u WHERE u.username LIKE %:username%")
quelle
Ich habe diesen Code ausprobiert und er funktioniert.
quelle