it-roy-ru.com

JPQL как регистр нечувствителен

Я хочу искать данные в таблице пользователей по имени без учета регистра.

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

}

Я получил ошибку: неожиданный токен:% . Где я должен разместить «%»?

12
windupurnomo

Вы можете использовать оператор concat:

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

или с именованным параметром:

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

(Протестировано с Spring Boot 1.4.3)

38
Wim Deblauwe

Если это только то, что вы хотите, и вы используете Spring Data JPA, вам не нужно писать запрос. 

List<User> findByNameContainingIgnoreCase(String name);

В противном случае вам нужно обернуть атрибут name с помощью %, прежде чем передать его методу (размещение их непосредственно в запросе просто не будет работать). Или не используйте запрос, а используйте спецификацию или Criteria API для создания запроса. 

11
M. Deinum

Вы можете использовать wildcard matching.

например, я хочу искать имя как 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