[지식] QueryDSL group by 방법

jijang·2021년 6월 11일
0

SPRING

목록 보기
2/2

QueryDSL에서 특정 조건에서 group by가 필요한 경우 작업한 내용을 공유한다.

  1. 작업 전 group by 쿼리를 만들고, 수행함으로 결과를 확인한다.

ex) SELECT a, b, count(id) FROM abc group by a, b;

  1. querydsl 설정 빈을 등록한다.
@Configuration
public class QuerydslConfig {

    @PersistenceContext
    private EntityManager entityManager;
    
    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}
  1. 쿼리를 수행할 class에서 작업진행
public class QueryDslTest {

	private final JPAQueryFactory queryFactory;
    	public QueryDslTest(JPAQueryFactory queryFactory) {
        	this.queryFactory = queryFactory;
	}
    
    queryFactory
                .select(
                        Projections.fields(abcDto.class,
                                abc.a,
                                abc.b,
                                abc.id.count().as("count"))
                )
                .from(abc)
                .groupBy(abc.a, abc.b)
                .orderBy(OrderByNull.DEFAULT)
                .fetch()
  1. QueryDsl에서 OrderBy를 넣은 이유
  • 인덱스가 없는 group by 쿼리는 filesort를 하기 때문에 성능이 느릴 수 있다.
  • 정렬이 필요 없는 경우 order by null으로 성능을 향상 시킬 수 있다.
  • QueryDsl에서는 order by null 구문을 지원하지 않는다.
  • OrderByNull 클래스를 직접 만들어 보자.
  • 참고 https://jojoldu.tistory.com/477
public class OrderByNull extends OrderSpecifier {
    public static final OrderByNull DEFAULT = new OrderByNull();

    private OrderByNull() {
        super(Order.ASC, NullExpression.DEFAULT, NullHandling.Default);
    }
}

0개의 댓글