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 '%'?
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)
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.
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");