web-dev-qa-db-fra.com

JPQL comme insensible à la casse

Je veux rechercher des données dans la table utilisateur par nom insensible à la casse.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where lower(u.name) like %lower(?1)%")
  public List<User> findByNameFree(String name);

}

J'ai une erreur: jeton inattendu:% . Où devrais-je placer '%'?

12
windupurnomo

Vous pouvez utiliser l'opérateur concat:

@Query("select u from User u where lower(u.name) like lower(concat('%', ?1,'%'))")
public List<User> findByNameFree(String name);

ou avec un paramètre nommé:

@Query("select u from User u where lower(u.name) like lower(concat('%', :nameToFind,'%'))")
public List<User> findByNameFree(@Param("nameToFind") String name);

(Testé avec Spring Boot 1.4.3)

38
Wim Deblauwe

Si c'est seulement ce que vous voulez et que vous utilisez Spring Data JPA, vous n'avez pas besoin d'écrire une requête. 

List<User> findByNameContainingIgnoreCase(String name);

Sinon, vous devez encapsuler l'attribut name avec % avant de le transmettre à la méthode (les placer directement dans la requête ne fonctionnera tout simplement pas). Ou n'utilisez pas de requête, mais utilisez une spécification ou l'API Criteria pour créer la requête. 

11
M. Deinum

Vous pouvez utiliser wildcard matching.

par exemple, je veux chercher un nom comme haha,

@Query("select u from User u where lower(u.name) like :u_name")
public List<User> findByNameFree(@Param("u_name") String name);
List<User> users = userDao.findByNameFree("%haha");
0
Nicholas