본문 바로가기
Spring/Querydsl

Query DSL - Dynamic Query

by 행운의나무 2022. 7. 6.
728x90
반응형

2022.06.24 - [Spring/Querydsl] - Query DSL 시작하기

 

Query DSL 시작하기

참고 Querydsl 기본문법 학습하기 Querydsl 다이나믹 쿼리 사용하기JPA와 비교 JPA 비교해 JPA의 장점 가독성이 좋다. JPA에서 기본적으로 제공하는 기능을 넘어서는 기능은 일반적으로 native query 옵션으

twer.tistory.com

DB

  • Member Table

member table

Dynamic Query

  • QueryDSL은 원하는 필드만 DTO로 뽑을 수 있다.
  • 동적 쿼리를 처리하는 두 가지 방법
    • BooleanBuilder를 이용하는 방법
    • Where 절에서 파라미터를 이용하는 방법

BooleanBuilder

  • null인지 아닌지 판별하여 builder를 조립해서 where 문에 넣는다.
  • .and(), .or()등을 이용해 조건을 추가할 수 있다.
@Repository public class MemberRepositorySupport extends QuerydslRepositorySupport { 
	private final JPAQueryFactory queryFactory; 
    public MemberRepositorySupport(JPAQueryFactory queryFactory) { 
    	super(Member.class); 
        this.queryFactory = queryFactory; 
    } 
    
    public List<Member> findMemberBooleanBuilder(String name, String address){ 
    	BooleanBuilder builder = new BooleanBuilder(); 
        
        if(name != null){ 
        	builder.and(member.name.eq(name)); 
        } 
        
        if(address != null){ 
        	builder.and(member.address.eq(address)); 
        } 
        
        return queryFactory 
        	.selectFrom(member) 
            .where(builder) 
            .fetch(); 
    }
}

/* =================== */  
@SpringBootTest  
class MemberRepositorySupportTest {

    @Autowired  
    private MemberRepositorySupport memberRepositorySupport;

    // BooleanBuilder  
    @Test  
    void booleanBuilderTest(){  
    List memberBooleanBuilder = memberRepositorySupport.  
    findMemberBooleanBuilder("test1", null);

    for(Member member : memberBooleanBuilder){  
    System.out.println(member.getName());  
    }

   }

}

/* =================== */  
/*  
결과  
test1  
*/

Where절에서 파라미터를 이용하는 방법

  • BooleanExpression 타입을 리턴하는 메서드를 만들어 조건을 추가하는 방식이다.
@Repository 
public class MemberRepositorySupport extends QuerydslRepositorySupport { 
	private final JPAQueryFactory queryFactory; 
    
    public MemberRepositorySupport(JPAQueryFactory queryFactory) { 
    	super(Member.class); 
        this.queryFactory = queryFactory; 
    }
    
    // BooleanExpression
	public List findMemberBooleanExpression(String name, String address){
    	return queryFactory
        .selectFrom(member)
        .where(nameEq(name), addressEq(address))
        .fetch();
    }
    
    // 결과가 null이면 where()에서 무시된다.
    private BooleanExpression nameEq(String name){
    return name != null ? member.name.eq(name) : null;

    }

    private BooleanExpression addressEq(String address){
    return address != null ? member.address.eq(address) : null;
    }

    }

/* =================== */
@SpringBootTest
class MemberRepositorySupportTest {
    @Autowired
private MemberRepositorySupport memberRepositorySupport;

	@Test
	void booleanExpressionTest(){
		List memberBooleanExpression = memberRepositorySupport.findMemberBooleanExpression("test1", null);
        
        for(Member member : memberBooleanExpression){
    		System.out.println(member.getName());
		}
     }

}

/* =================== /
/
결과
test1
*/

참고

Querydsl 동적 쿼리
querydsl 동적 쿼리 - 개발자로 성장하기

쿠팡으로 연결 클릭

 

제주삼다수 그린

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

반응형

'Spring > Querydsl' 카테고리의 다른 글

[Spring boot 3.0.0 이상] build.gradle 설정  (0) 2022.12.13
Query DSL 시작하기  (0) 2022.12.12
Query DSL - Paging  (0) 2022.07.06
Query DSL - CASE  (0) 2022.07.05
Query DSL - Subquery  (0) 2022.07.05