본문 바로가기
Kotlin

[QueryDSL] 동적 쿼리 작성하기/BooleanBuilder, BooleanExpression

by 고체물리학 2022. 12. 7.

조건에 따라 쿼리문을 다르게 작성하고 싶을 때 쓰는 방법

 

- BooleanBuilder

 
fun findDynamicQuery(name: String?, age: String?, phoneNumber: String?):List<Member>{
    val builder = BooleanBuilder()
    if (!StringUtils.isNullOrEmpty(name)) builder.and(member.name.eq(name))
    if (!StringUtils.isNullOrEmpty(age)) builder.and(member.age.eq(age))
    if (!StringUtils.isNullOrEmpty(phoneNumber)) builder.and(member.phoneNumber.eq(phoneNumber))
    return queryFactory.selectFrom(member)
        .where(builder)
        .fetch()
}

 

여러개의 if로 구성되어 있어 where문 통째로 어떤 쿼리인지 보기 어렵고

조건이 더 많아진다면 결과를 더 추측하기 힘들 것

 

- BooleanExpression

fun findDynamicQuery(name: String?, age: String?, phoneNumber: String?): List<Member> {
    return queryFactory
        .selectFrom(member)
        .where(
            eqName(name),
            eqAge(age),
            eqPhoneNumber(phoneNumber)
        )
        .fetch()
}

fun eqName(name: String?): BooleanExpression? {
    return if (StringUtils.isNullOrEmpty(name)) null else member.name.eq(name)
}

fun eqAge(age: String?): BooleanExpression? {
    return if (StringUtils.isNullOrEmpty(age)) null else member.age.eq(age)
}
fun eqPhoneNumber(phoneNumber: String?): BooleanExpression? {
    return if (StringUtils.isNullOrEmpty(phoneNumber)) null else member.age.eq(age)
}
 

BooleanExpression을 이용하여 명시적으로 알 수 있는 코드를 작성할 수 있게 된다

where에 and or , 로 조건을 추가할 수 있어 한눈에 보기 편하다

null이 반환시 자동으로 조건절에서 제외되지만

모든 조건문이 null인 경우를 대비하여 and연산자보다는 , 를 사용하여 null  Exception을 방지한다

반응형

댓글