JPA기반에서 쿼리를 작성할 경우 Like 조건문을 사용하는 방법에 대해서 간단하게 정리해 봅니다.

 

JPA에서 쿼리를 작성하는 방법은
QueryDSL과 같은 별도의 3rd Party 라이브러리를 사용하지 않는다면,
크게 두 가지 방법으로 나뉩니다.

 

  1. JPQL (Java Persistance Query Language) 방식
  2. Method Name 방식

 

단순하고 간단한 쿼리의 경우,

JPA에서 기본으로 제공하는 Method Name방식만 사용해도 충분히 구사가 가능하나
복잡하고 섬세한(? ) - 조인, 집계등등 - 쿼리의 경우 Method Name방식으로는 한계가 있습니다.


이런 한계를 극복하기 위해 나온 방식이 JPQL입니다.

JPQL은 대부분의 RDBMS에 지원하는 표준 SQL문법과 매우 비슷한 형태를 가진 ‘객체지향 쿼리’입니다.


당연히 객체 지형 쿼리이기 때문에 Type Safty ( 아니, Query Safty )합니다.

따라서 쿼리문 오류를 컴파일시에 잡아낼 수 있습니다.


iBatis와 같은 매퍼 라이브러리와 가장 큰 차이점(장점)중 하나입니다.

쿼리문 자체는 일반 SQL문과 매우 비슷한 형태이나 ‘객체지향 쿼리’이기 때문에 몇 가지 분명한 차이점이 있습니다.

 

이 차이점을 모르고 기존의 일반 SQL문을 작성하던 방식대로 작성하게 되면 ‘컴파일 오류’를 자주 만나보게 될 겁니다.

 

간단하게만 언급하자면 ,

 

  1. 대소문자의 구분 ( 엔티티와 속성명에 한정 )
  2. 별칭 필수 ( ‘AS’ 생략 가능)
  3. 표준 SQL 문법만 허용 ( 특정 밴더에 종속적인 함수, 문법 사용불가)

 

이 차이점에 대해서는 기회가 되면, 따로 상세하게 다뤄보도록 하겠습니다.

 

참고로 JPQL의 ‘nativeQuery’ 옵션을 ’true’로 놓고 사용하면 일반 SQL문과 동일한 방식으로 구사가 가능합니다.
정말 꼭 필요한 경우가 아니라면,
JPA를 도입해 놓고 굳이 native query를 사용하는 것은 지양하는 것이 좋습니다.

 

이런 예외가 많아질 수밖에 없는 구조라면,
차라리 iBatis와 같은 SQL Mapper 라이브러리를 도입하는 것이 훨씬 더 효율적일 거라고 생각합니다.

 

 

Method기반의  Like조건을 적용하는 방법은 간단합니다.

개인적으로 'StartingWith'와 'EndingWith'의 의미를 계속 거꾸로 이해를 해서 사용할 때마다 헷갈리기는 합니다...

 

1. LIKE :검색어 

List<User> findByUsernameLike(String username);

2. LIKE :검색어%

List<User> findByUsernameStartingWith(String username);

3. LIKE %:검색어

List<User> findByUsernameEndingWith(String username);

4. LIKE %:검색어%

List<User> findByUsernameContaining(String username);

 

참고

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기