QueryDSL 문자열 포함 검색

like 와 contains 비교하기

Posted on 2019-03-25

QueryDSL 문자열 포함 검색


특정 문자열을 포함하는 검색 쿼리를 작성해보자.
다음 예제는 이메일에 test 라는 문자열을 포함한 사용자를 검색하는 쿼리다.

SELECT *
FROM user
WHERE email LIKE '%test%';

위와 같은 쿼리를 QueryDSL을 사용하여 type-safe 하게 작성해보자.
like 메서드를 사용하더라도 검색어를 %로 감싸주어야 한다.

String keyword = "test";
JPAQuery query = new JPAQuery(entityManager);
QUser qUser = QUser.user;
List<User> list = query.from(qUser)
.where(qUser.email.like("%" + keyword + "%"))
.list(qUser);
// binding param - %test%

그러나 contains 메서드를 사용하면 직접 감싸주지 않아도 자동으로 바인딩된다.

String keyword = "test";
JPAQuery query = new JPAQuery(entityManager);
QUser qUser = QUser.user;
List<User> list = query.from(qUser)
.where(qUser.email.contains(keyword))
.list(qUser);
// binding param - %test%

두 메서드의 차이를 기억하자.