programing

JPQL 대소문자 구분 안 함

magicmemo 2023. 7. 30. 17:34
반응형

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

}

오류가 발생했습니다. 예기치 않은 토큰: %.'%'를(를) 어디에 배치해야 합니까?

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과 함께 테스트)

Spring Data JPA를 사용하는 경우에만 조회를 작성할 필요가 없습니다.

List<User> findByNameContainingIgnoreCase(String name);

그렇지 않으면 포장이 필요합니다.name로 귀속시키다.%메소드에 전달하기 전에(쿼리에 직접 있는 것은 단순히 작동하지 않습니다).또는 쿼리를 사용하지 않고 사양 또는 Criteria API를 사용하여 쿼리를 생성합니다.

나는 Spring Boot 2.1.6을 사용하고 있습니다. 다음과 같이 Containing, Contains 및 IsContaining을 사용하여 쿼리 방법을 정의할 수 있습니다.

List<User> findByNameContaining(String name);
List<User> findByNameContains(String name);
List<User> findByNameIsContaining(String name);

대소문자 구분 안 함:

List<User> findByNameContainingIgnoreCase(String name);

또는 다음과 같이 정의할 수도 있습니다.

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

여기서 @Param 주석은 명명된 매개 변수를 사용하기 때문에 중요합니다.

concat 사용 및 TypedQuery 사용 안 함:

  TypedQuery<Baptism> query = entityManager.createQuery("SELECT d FROM " + Baptism.class.getSimpleName()
                            + " d JOIN d.person p WHERE UPPER(p.lastName) LIKE UPPER(:ln)", Baptism.class);
                    query.setParameter("ln", "%" + ln + "%");

스프링 부트 명명 규칙 전략을 사용하여 다음과 같은 명명 패턴을 달성할 수 있습니다.YourFieldCamelCase무시하는 케이스처럼

example: findByUserNameLikeIgnoreCase(userName: String): List<UserEntity>

사용할 수 있습니다.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");

언급URL : https://stackoverflow.com/questions/37178520/jpql-like-case-insensitive

반응형