본문 바로가기
Develop/Spring

[querydsl] 동적 쿼리 만들기

by 코딩의성지 2021. 7. 8.

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();

 

끝.

반응형

댓글