web-dev-qa-db-fra.com

Spring JPA @Query avec LIKE

J'essaie de créer une méthode dans CrudRepository qui pourra me donner la liste des utilisateurs, dont les noms d'utilisateur sont LIKE au paramètre d'entrée (non seulement commence par, mais le contient également). J'ai essayé d'utiliser la méthode "findUserByUsernameLike(@Param("username") String username)" mais, comme indiqué dans la documentation de Spring, cette méthode est égale à "where user.username like ?1". Ce n'est pas bon pour moi, car j'ai déjà dit que j'essayais d'obtenir tous les utilisateurs dont le nom d'utilisateur contient ... 

J'ai écrit une requête à la méthode, mais elle ne se déploie même pas.

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

Quelqu'un peut-il m'aider avec ça?

45
Viktoriia

Essayez d'utiliser l'approche suivante (cela fonctionne pour moi):

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

Remarque: le nom de la table en JPQL doit commencer par une lettre majuscule.

96
Mark

Utilisation de Création de requêtes à partir de noms de méthodes , consultez le tableau 4 où ils expliquent certains mots clés.

  1. Utiliser Like: sélectionnez ... like: nom d'utilisateur

    List<User> findByUsernameLike(String username);
    
  2. StartingWith: sélectionnez ... comme: nom d'utilisateur%

    List<User> findByUsernameStartingWith(String username);
    
  3. EndingWith: sélectionnez ... comme%: nom d'utilisateur

    List<User> findByUsernameEndingWith(String username);
    
  4. Contenant: sélectionnez ... comme%: nom d'utilisateur%

    List<User> findByUsernameContaining(String username);
    

Notez que la réponse que vous recherchez est numéro 4. Vous n'êtes pas obligé d'utiliser @Query

79
jmgoyesc

Une autre façon: à la place de la fonction CONCAT, nous pouvons utiliser le double tuyau:: nom de famille || '%'  

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

Vous pouvez mettre n'importe où, préfixe, suffixe ou les deux 

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

Facile à utiliser après (pas besoin d'utiliser CONCAT ou ||):

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

Documenté dans: http://docs.spring.io/spring-data/jpa/docs/current/reference/html .

4
Míra

Pour votre cas, vous pouvez directement utiliser les méthodes JPA. C'est comme ci-dessous:

Contenant: sélectionnez ... comme%: nom d'utilisateur%

List<User> findByUsernameContainingIgnoreCase(String username);

ici, IgnoreCase vous aidera à rechercher un élément en ignorant le cas.

Voici quelques méthodes connexes:

  1. J'aimefindByFirstnameLike

    … Où x.firstname aime? 1

  2. StartingWithfindByFirstnameStartingWith

    … Où x.firstname like? 1 (paramètre lié avec% ajouté)

  3. FinWithfindByFirstnameEndingWith

    … Où x.firstname like? 1 (paramètre lié avec% ajouté)

  4. ContenantfindByFirstnameContaining

    … Où x.firstname like? 1 (paramètre lié enveloppé dans%)

Plus d'infos, voir ce lien et ce lien

J'espère que ceci vous aidera :)

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

Cela fonctionne pour moi (avec 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);

Expliquant: Les? 1,? 2,? 3 etc. sont des espaces réservés aux premier, deuxième, troisième paramètres, etc. Dans ce cas, il suffit que le paramètre soit entouré de% comme s'il s'agissait d'une requête SQL standard mais sans le Guillemets simples.

0
Uisleandro