jpql @Query where null 무시 조건. 이럴 땐 이렇게

jaycee·2023년 11월 15일
0
post-thumbnail

summary

조회 api에서 빈칸으로 들어온 필드에 대해 검색 처리 시 무시하고 싶을 때 처리 방법

@Query(
	"select u "+
	" from user u " +
	" where (:searchId is null or u.id = :searchId) "+ //Long 타입 처리 시
	" and (coalesce(:searchSeq, null) is null or m.seq = :searchSeq)" + //String 타입이면서 =연산 비교인 경우는 미리 빈칸 파라미터 null로 변환 필요
	" and (coalesce(:searchUserName, null) is null or g.name like %:searchUserName%) " + //String 타입이면서 like 연산 비교인 경우 
	" and (coalesce(:searchUserEmail, null) is null or g.email like %:searchUserEmail%) "
)

String 타입이 아닌 필드

조건필드 is null or 조건을 사용한다.

@Query(
	"select u "+
	" from user u " +
	" where (:searchId is null or u.id = :searchId) "+
)

String 타입 필드의 =(같다) 조건

  1. 파라미터 받을 때 빈칸("")이면 null로 변환한다.
prmMap.get("search_emp_no") == "" ? null: (String)prmMap.get("search_emp_no")
  1. 조건필드 is null or 조건과 함께 coalesce 함수를 이용한다.
@Query(
	"select u "+
	" from user u " +
	" where (coalesce(:searchEmpNo, null) is null or g.mallCd = :searchEmpNo)"
)

coalesce 함수가 하는 일은?

coalesce(a, b, c ...) 입력 시 a, b, c 순서로 순회하면서 null이 아닌 첫 번째 값을 리턴하는 함수. 전부 null이면 null을 리턴.

String 타입 필드의 like 조건

조건필드 is null or 조건과 함께 coalesce 함수를 이용한다.

@Query(
	"select u "+
	" from user u " +
	" where (coalesce(:searchUserName, null) is null or g.name like %:searchUserName%) " +
	" and (coalesce(:searchUserEmail, null) is null or g.email like %:searchUserEmail%) "
)

조건이 많아 지니까 mybatis보다 jpql이 더 복잡해저벌임

profile
오늘도 하나 배웠다.

0개의 댓글

관련 채용 정보