mybatis는 특정한 xml에서 sql을 처리하고, 거기서 또 동적 쿼리를 처리한다.
이게 생각보다 나는 많이 불편했다. querydsl은 java 코드 내에서 동적 쿼리 처리가 가능하다.
이는 큰 이점이라고 생각한다.
오늘은 querydsl에서 동적쿼리를 처리하는 두가지 방법에 대해 작성해보려고한다.
1.BooleanBuilder
이 방법은 QueryDSL에서 공식적으로 문서로 남겨져 있는 방식인데 null인지 아닌지를 판별하여 builder를 조립해서 끼워 넣는 방식으로 작업을 한다.
//BooleanBuilder builder = new BooleanBuilder(member.userName.eq(nameCond)); // 이런식으로 초기값 설정 가능
BooleanBuilder builder = new BooleanBuilder();
if (nameCond != null) {
builder.and(member.userName.eq(nameCond));
}
if (ageCond != null) {
builder.and(member.age.eq(ageCond));
}
return queryFactory
.selectFrom(member)
.where(builder)
.fetch();
2.. Where 에 파라미터를 이용하는 방법
private BooleanExpression userNameEq(String nameCond) {
// if (nameCond != null ) {
// return member.userName.eq(nameCond);
// } else {
// return null; // where에 null 이들어가면 무시됨.그걸이용해서 동적쿼리를 만듦
// }
return nameCond != null ? member.userName.eq(nameCond) : null;
}
private BooleanExpression ageEq(Integer ageCond) {
return ageCond != null ? member.age.eq(ageCond) : null;
}
이런식으로 각조건에 대해 null 인지 판별하고 BooleanExpression을 리턴하도록만들어주는 메서드를 만들어 주고, 실제 사용은 아래처럼 하면된다.
List<Member> result = queryFactory
.selectFrom(member)
.where(userNameEq(nameCond), ageEq(ageCond))
.fetch();
그리고 이 where 절로 동적 쿼리를 처리하는 방법은 내부에서 and로 조립하는 방법도 가능하다.
private BooleanExpression nameAndAgeEq(String nameCond, Integer ageCond) {
return userNameEq(nameCond).and(ageEq(ageCond));
}
List<Member> result = queryFactory
.selectFrom(member)
.where(nameAndAgeEq(nameCond, ageCond))
.fetch();
끝.
반응형
'Develop > Spring' 카테고리의 다른 글
Spring Boot 프로젝트에서 환경에 따라 다른 Profile 등록하기 (0) | 2021.07.09 |
---|---|
[querydsl] batch 성 거래 처리하기 (0) | 2021.07.08 |
[querydsl] querydsl에서 projection 다루기 (0) | 2021.07.07 |
[querydsl] concat 사용법 (문자열 붙이기) (1) | 2021.07.07 |
[querydsl] querydsl 에서 서브쿼리 사용하는 법 (1) | 2021.07.05 |
댓글