Querydsl - case문, 상수, concat, projection

청포도봉봉이·2023년 3월 23일
0

Spring

목록 보기
7/35
post-thumbnail

Basic Case

	@Test
    public void basicCase() {
        List<String> fetch = queryFactory
                .select(member.age
                        .when(10).then("열살")
                        .when(20).then("스무살")
                        .otherwise("기타"))
                .from(member)
                .fetch();

        for (String s : fetch) {
            System.out.println("s = " + s);
        }
    }
  • select절에 when(), then(), otherwise()를 통한 간단하게 표현 가능



Complex Case

	@Test
    public void complexCase() {
        List<String> fetch = queryFactory
                .select(new CaseBuilder()
                        .when(member.age.between(0, 20)).then("0~20살")
                        .when(member.age.between(21, 30)).then("21~30살")
                        .otherwise("기타")
                )
                .from(member)
                .fetch();
        for (String s : fetch) {
            System.out.println("s = " + s);
        }
    }
  • between()까지 사용한 표현



Constant

	@Test
    public void constant() {
        List<Tuple> fetch = queryFactory
                .select(member.username, Expressions.constant("A"))
                .from(member)
                .fetch();

        for (Tuple tuple : fetch) {
            System.out.println("tuple = " + tuple);
        }
    }
  • 자바에서 상수는 값이 할당된 후 값을 변경할 수 없는 변수이다.
  • 조회결과론 username과 상수 A가 나온다.



Concat

	@Test
    public void concat() {
        List<String> fetch = queryFactory
                .select(member.username.concat("_").concat(member.age.stringValue()))
                .from(member)
                .where(member.age.eq(10))
                .fetch();

        for (String s : fetch) {
            System.out.println("s = " + s);
        }
    }
  • concat() 문법은 문자를 합쳐주는 역할을 한다.
  • member.age는 int이므로 .StringValue() 를 통해 값을 가져온다.



Simple Projection

	@Test
    public void simpleProjection() {
        List<String> fetch = queryFactory
                .select(member.username)
                .from(member)
                .fetch();

        for (String s : fetch) {
            System.out.println("s = " + s);
        }
    }
  • Projection은 select 대상을 지정하는 것을 의미한다.
  • 위의 예시에선 member.username만 지정했다.



Tuple Projection

	@Test
    public void tupleProjection() {
        List<Tuple> fetch = queryFactory
                .select(member.username, member.age)
                .from(member)
                .fetch();

        for (Tuple tuple : fetch) {
            String username = tuple.get(member.username);
            Integer age = tuple.get(member.age);
            System.out.println("username = " + username);
            System.out.println("age = " + age);
        }
    }
  • Querydsl에선 select에 대상을 2개 이상 지정하면 반환 타입을 Tuple로 해준다.
  • 반환타입이 tuple 객체일때 .get()을 통해 원하는 데이터를 뽑을 수 있다.



Tuple

Tuple은 Querydsl에서 쿼리 결과를 나타내는 인터페이스 중 하나입니다. Tuple은 일종의 튜플(tuple) 객체로, 여러 필드를 담을 수 있습니다. 예를 들어, SELECT 절에서 여러 개의 컬럼을 선택하면 각 컬럼의 값을 Tuple 객체에 담아서 반환합니다. Tuple은 인덱스(index)를 사용하여 필드에 접근할 수 있으며, 필드의 순서는 쿼리 결과의 컬럼 순서와 일치합니다.

Projection

Projection은 Querydsl에서 쿼리 결과를 원하는 형식으로 변환하는 방법 중 하나입니다. Projection은 쿼리 결과를 원하는 필드나 객체에 매핑합니다. 예를 들어, SELECT 절에서 한 개의 컬럼만 선택하더라도 Projection을 사용하여 원하는 객체에 매핑할 수 있습니다. 이렇게 하면 쿼리 결과를 원하는 객체의 필드에 직접 할당할 수 있으므로, 코드의 가독성과 유지 보수성을 높일 수 있습니다. Projection은 여러 형식으로 지원되며, Querydsl에서 제공하는 Projections 클래스를 사용하여 쉽게 작성할 수 있습니다.

profile
서버 백엔드 개발자

0개의 댓글