본문 바로가기
개발자 전향 프로젝트

[Spring Boot] 대소문자 구분 없이 검색하는 로직 (JPA + Oracle)

by 샘오리 2022. 10. 14.

https://samori.tistory.com/40

 

[Spring Boot] 세상 쉬운 검색창(검색 로직) 만들기 1-2 (백 로직)

샘플 Entity는 Staff로 정하고 설명을 위해 제공 @Getter @Entity @NoArgsConstructor public class Staff { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; pr..

samori.tistory.com

위 글에 이어 

Spring Data Jpa 와 Oracle 사용시 대소문자 구분없이 검색하는 로직을 어떻게 처리해야할지와

로직은 알겠는데 네이티브 쿼리에서 매개변수를 인식하지 못하는 현상을 어떻게 해결했는지 공유하려고 한다.

 

대소문자 구분없이 검색하는 방법은 그냥 VIEW단에서 대문자나 소문자로 바꿔서 보내거나

쿼리에서 받는값과 찾는값을 둘다 같은 케이스로 맞춰주면 된다.

 

그말은 즉슨, UPPER를 쓰거나 LOWER를 써서 괄호안에 받는값과 찾는값을 넣어주면 된다는 것이다.

아래는 기본적인 UPPER 혹은 LOWER를 쓰는 방법이다.

https://dololak.tistory.com/797

 

[Oracle] 대소문자 구분 없이 검색하는 경우에 WHERE 조건

오라클 대소문자 구분 없이 검색하는 경우에 WHERE 조건 테이블의 문자열 컬럼을 대상으로 대소문자를 가리지 않고 검색을 해야할 때가 있습니다. 예를 들어 고객사의 이름이 대소문자를 구분하

dololak.tistory.com

 

일반적으로 특정 String 값을 찾는 것은 위 내용처럼 하면 되겠지만

JPA 에서도 native 쿼리를 쓰면서 검색값을 매개변수로 받아 검색을 하고 싶은 경우가 있을텐데

어떻게 써야 매개변수를 인식하는지 모를 것이다. 아래처럼 하면 된다.

UPPER(찾고자 하는 칼럼명) LIKE UPPER('%' || :검색한 값을 담은 매개변수 || '%')

 아래는 샘플코드이다.

// 페이징 할 경우
@Transactional
@Query(value = "SELECT * FROM 테이블명 WHERE UPPER(칼럼명1) LIKE UPPER('%' || :검색한 값을 담은 매개변수 || '%') OR UPPER(칼럼명2) LIKE UPPER('%' || :검색한 값을 담은 매개변수 || '%')", nativeQuery = true)
Page<CodeDto> findBySearchValueList(Pageable pageable, @Param("검색한 값을 담은 매개변수") String 검색한 값을 담은 매개변수);

// 페이징 없이 할 경우
@Transactional
@Query(value = "SELECT * FROM 테이블명 WHERE UPPER(칼럼명1) LIKE UPPER('%' || :검색한 값을 담은 매개변수 || '%') OR UPPER(칼럼명2) LIKE UPPER('%' || :검색한 값을 담은 매개변수 || '%')", nativeQuery = true)
List<VO나 DTO 명> findBySearchValueList(@Param("검색한 값을 담은 매개변수") String 검색한 값을 담은 매개변수);

이렇게 되면 Case Insensitive한 검색이 가능해진다.

 

참 쉽죠?