JPA

Querydsl - Expressions클래스로 select에서 상수 사용하는 법

Cold Bean 2024. 11. 14. 22:27
728x90

개요

쿼리 성능을 개선하는 방법 중 하나는 이미 선언된 값은 그대로 사용하는 것이다.

매개변수로 넘어왔구나 이미 알고 있는 값을 DB에서 조회하는건 불필요하다. 이 밖에도 Entity보다 DTO로 필요한 필드만 가져오거나 where 및 join 문에 인덱스가 있는 필드만 사용하는 등의 방법이 있다.

 

본 글에서는 Expressions 클래스로 Querydsl에서 select문에서 상수를 사용하는 방법을 알아보자

com.mysema.query.support.Expressions 클래스는 동적 표현식 생성을 위한 클래스이다.

 

constant()

constant 표현식은 Entity에 선언되지 않은 필드를 상수로 반환하고 싶을 때 사용한다.

Expressions.constant(value) 형태로 사용할 수 있고 Expressions.as(source, alias)와 함께 사용해서 alias를 지정할 수 있다.

    public List<Tuple> findMembersWithConstant() {
        return queryFactory
            .select(
                member.name,
                member.age,
                Expressions.as(Expressions.constant("S"), "rank") // 상수 "S" 추가
            )
            .from(member)
            .fetch();
    }
name age rank
김찬빈 30 S

 

constantAs()

constantAs()는 조회 조건에 사용됐던 값을  select에서도 쓸 때 사용하면 좋다. 

xrpessions.constantAs(source, alias) 첫 번째 파라미터에는 조회에 사용될 상수값, 두 번째 파라미터에는 QClass의 필드를 사용할 수 있다. 대신 DTO필드와 Entity의 필드 이름, 타입이 동일해야 한다. 만약 일치하지 않으면 컴파일 에러가 발생한다.

public class MemberDto {
    private String name;
    private int age;
    private String rank;
}
    public List<Tuple> findMembersWithConstant() {
        return queryFactory
    	    .select(Projections.fields(MemberDto.class,
                member.name, 
                Expressions.constantAs("S", member.rank))
    	    .from(member)
    	    .fetch();
    }

 

asNumber(), asString()

특정 타입의 상수를 명시적으로 생성할 수 있다. 이 방식을 사용하면 select에서 간단하게 상수를 사용할 수 있다.

    public List<Tuple> findMembersWithConstant() {
        return queryFactory
            .select(
                member.name,
                member.age,
                Expressions.asString("S").as("rank"),
                Expressions.asNumber(177).as("height")
            )
            .from(member)
            .fetch();
    }
name age rank height
김찬빈 30 S 177

 

numberTemplate(), stringTemplate(), booleanTemplate()

SQL 함수나 정규 표현식을 포함한 상수를 만들 때 유용하다.

    public List<Tuple> findMembersWithConstant() {
        return queryFactory
            .select(
                Expressions.stringTemplate("CONCAT({0}, '_', {1})", member.name, "'최고'")).as(member.name),
                Expressions.numberTemplate(Integer.class, "10 + 20").as(member.age),
                member.height.as("height"),
                Expressions.booleanTemplate("{0} >= 180", member.height).as("isTall")
            )
            .from(member)
            .fetch();
    }
name age height isTall
김찬빈_최고 30 177 false

 

참조

https://dzone.com/articles/6-simple-performance-tips-sql

 

6 Simple Performance Tips for SQL SELECT Statements

 

dzone.com

http://querydsl.com/static/querydsl/3.4.0/reference/ko-KR/html/ch03.html

 

3장. 일반 사용법

Querydsl에서 Query를 생성하려면 표현식 인자를 이용해서 query 메서드를 호출한다. query 메서드는 모듈에 따라 다르고 이미 튜토리얼에서 설명했으므로, 본 절에서는 표현식에 초점을 맞출 것이다.

querydsl.com

http://querydsl.com/static/querydsl/4.0.7/apidocs/com/querydsl/core/types/dsl/Expressions.html

 

Expressions (Querydsl 4.0.7 API)

 

querydsl.com

https://jojoldu.tistory.com/523

 

Querydsl select에서 상수 사용하기

쿼리 성능을 개선할 수 있는 여러 방법 중에 가장 쉬운 방법은 조회하는 컬럼의 수를 최소화하는 것입니다. dzone-6-simple-performance-tips-sql 무분별하게 Entity를 가져오기 보다는 Dto로 필요한 필드만

jojoldu.tistory.com

 

728x90