본문 바로가기
Framework and Tool/JPA

JPA - 객체지향 쿼리 언어 - QueryDSL 메소드 위임

by ocwokocw 2021. 8. 26.

- 참조: 자바 ORM 표준 JPA 프로그래밍

- 메소드 위임

메소드 위임을 사용하면 쿼리 타입에 검색 조건을 직접 정의할 수 있다.

 

public class MemberExpression {

	@QueryDelegate(Member.class)
	public static BooleanExpression isAdult(QMember member) {
		
		return member.age.gt(19);
	}
}

 

Member 엔티티가 성인인지를 판단하는 검색조건을 추가해본다고 가정하자.

 

메소드 위임 기능을 사용하려면 static 메소드를 만들고 @QueryDelegate 어노테이션을 지정한다. 어노테이션 인자에는 해당 기능을 적용할 엔티티를 설정한다. 메소드의 첫번째 파라미터에는 Q-type 을 지정하고 나머지는 필요한 파라미터를 작성한다.

 

예제에서는 단순하게 Member 의 나이가 19 초과인지를 쿼리하기 위해 파라미터가 필요 없어 지정하지 않았지만 파라미터가 필요한 메소드라면 추가로 파라미터를 주면된다.

 

@Generated("com.querydsl.codegen.EntitySerializer")
public class QMember extends EntityPathBase<Member> {

.................

    public BooleanExpression isAdult() {
        return MemberExpression.isAdult(this);
    }

 

작성 후 Q-type 을 보면 정의한 메소드가 생성되었을 것이다. 메소드 위임 기능을 사용해서 19살 초과인 Member 들만 질의해보자.

 

JPAQueryFactory query = new JPAQueryFactory(em);

QMember m = new QMember("m");

List<Member> members = query.select(m)
	.from(m)
	.where(m.isAdult())
	.fetch();

members.forEach(member -> {
	System.out.println("Member name: " + member.getName() + 
			", age: " + member.getAge());
});

 

원래 같았으면 where 절에 m.age.gt(19) 와 같이 Predicate 를 인자로 넘겨야 했겠지만 isAdult() 라는 메소드로 표현함으로써 더 간결하고 의도가 명확한 메소드 이름으로 조건절을 작성할 수 있게 되었다.

댓글