JPA/queryDsl

동적 쿼리 생성

lovineff 2020. 6. 9. 11:04

BooleanBuilder 사용

// 동일 함수 내에서 구현
BooleanBuilder booleanBuilder = new BooleanBuilder();
if(id != null && id != 0L){
    booleanBuilder.and(user.id.eq(id));
}

if(name != null && !"".equals(name)){
    booleanBuilder.and(user.name.eq(name));
}


return jpaQueryFactory
        .select(Projections.fields(
                com.test.react.Model.User.class,
                user.id.as("userId"),
                user.name.as("name"),
                userDetail.id.as("userDetailId"),
                userDetail.age.as("age"),
                userDetail.address.as("address")
        )).from(user)
        .leftJoin(userDetail)
        .on(userDetail.userId.eq(user.id))
        .where(booleanBuilder)  // 동적 쿼리
        .offset((page <= 0) ? 0 : (page -1))
        .limit(blockCnt)
        .fetch();

 

BooleanExpression 사용

재사용 가능

주로 사용하게 된다

// 동적 쿼리를 외부에 구현
private BooleanExpression usernameEq(String name){
    return (name != null && !"".equals(name)) ? user.name.eq(name) : null;
}

private BooleanExpression userIdEq(Long id){
    return (id != null && id != 0L) ? user.id.eq(id) : null;
}

private function(){
    return jpaQueryFactory
        .select(Projections.fields(
                com.test.react.Model.User.class,
                user.id.as("userId"),
                user.name.as("name"),
                userDetail.id.as("userDetailId"),
                userDetail.age.as("age"),
                userDetail.address.as("address")
        )).from(user)
        .leftJoin(userDetail)
        .on(userDetail.userId.eq(user.id))
        .where(usernameEq(name), userIdEq(id))  // 동적 쿼리
        .offset((page <= 0) ? 0 : (page -1))
        .limit(blockCnt)
        .fetch();
}

 

 

'JPA > queryDsl' 카테고리의 다른 글

DB 함수 호출  (0) 2021.03.22
queryDsl 모듈별 빌드  (0) 2021.03.09
Filter 이름별 조건 설정 방법  (0) 2021.03.09
UPDATE, DELETE 문  (0) 2020.06.09
Select 문  (0) 2020.06.09