QueryDSL를 이용해서 동적 쿼리를 생성하는 방식들을 보도록 하겠습니다.
@Test
void booleanBuilder() {
String usernameParam = "MemberA";
Integer ageParam = 25;
//SELECT *FROM member WHERE username = "MemberA" AND age = 25;
List<Member> result = searchMember1(usernameParam, ageParam);
System.out.println("result.get(0) = " + result.get(0));
Assertions.assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember1(String usernameParam, Integer ageParam) {
BooleanBuilder builder = new BooleanBuilder();
if (usernameParam != null) {
builder.and(member.username.eq(usernameParam));
}
if (ageParam != null && ageParam >= 0) {
builder.and(member.age.eq(ageParam));
}
return factory
.selectFrom(member)
.where(builder)
.fetch();
}
BooleanBuilder를 통해서 파라미터 값이 존재 할때 조건에 WHERE 조건에 추가되도록 합니다. BooleanBuilder를 통해 로직에 따라서 WHERE에 추가할 조건들을 지정해 줄 수 있으며, WHERE에 해당 BooleanBuilder를 넣으면 조건에 맞에 WHERE문이 처리 됩니다.
@Test
void WhereParam() {
String usernameParam = "MemberA";
Integer ageParam = 25;
List<Member> result = searchMember2(usernameParam, ageParam);
System.out.println("result.get(0) = " + result.get(0));
Assertions.assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember2(String usernameParam, Integer ageParam) {
return factory
.selectFrom(member)
.where(usernameEq(usernameParam), ageEq(ageParam)) //where(null)이면 무시 됨 -> ex: where(null, member.username.eq("MemberA")) 이면 null은 무시되고, username = "MemberA" 조건만 추가됨
.fetch();
}
private BooleanExpression usernameEq(String usernameParam) {
// NULL이 아니면 WHERE 조건 추가됨; NULL 이면 NULL을 그대로 반환
return usernameParam != null ? member.username.eq(usernameParam) : null;
}
private BooleanExpression ageEq(Integer ageParam) {
// NULL이 아니면 WHERE 조건 추가됨; NULL 이면 NULL을 그대로 반환
return ageParam != null ? member.age.eq(ageParam) : null;
}
QueryDSL에서 WHERE 문에 조건들을 추가할때 원하는 조건들을 그대로 나열해서 작성할 수 있는 특성을 이용한 방식입니다. 대신, where()에서 null 값은 무시되다는 특징을 이용해서 로직에 따라서 WHERE에 조건을 추가할지, 아니면 null을 추가할지 정해줍니다.