동적 쿼리를 해결하는 두가지 방법

문서에는 BooleanBuilder가 많이 나오지만 각각의 장단점이 있고 둘 다 사용해야 한다.

@Test
public void dynamicQuery_BooleanBuilder() {
	String usernameParam = "member1";
	Integer ageParam = 10;

	List<Member> result = searchMember1(usernameParam, ageParam);
	assertThat(result.size()).isEqualTo(1);
}

private List<Member> searchMember1(String usernameCond, Integer ageCond) {
	BooleanBuilder builder = new BooleanBuilder();

	if (usernameCond != null) {
		builder.and(member.username.eq(usernameCond));
	}

	if (ageCond != null) {
		builder.and(member.age.eq(ageCond));
	}

	return queryFactory
			.select(member)
			.from(member)
			.where(builder)
			.fetch();
}

이런 식으로 기본 조건을 사용할 수 있다.

@Test
public void dynamicQuery_BooleanBuilder() {
	String usernameParam = "member1";
	Integer ageParam = null;

	List<Member> result = searchMember1(usernameParam, ageParam);
	assertThat(result.size()).isEqualTo(1);
}

private List<Member> searchMember1(String usernameCond, Integer ageCond) {
	BooleanBuilder builder = new BooleanBuilder(member.age.eq(10));

	if (usernameCond != null) {
		builder.and(member.username.eq(usernameCond));
	}

	if (ageCond != null) {
		builder.and(member.age.eq(ageCond));
	}

	return queryFactory
			.select(member)
			.from(member)
			.where(builder)
			.fetch();
}