티스토리 뷰

반응형

2019/03/05 - [Programming/JOOQ] - [JOOQ-04] 좀 더 복잡한 질의 실행해보기


JOOQ 에서는 앞선 예제에서와 같이 Record3 와 같은 Record 을 제공해줍니다. 결과가 3 개일 때에는 Record3, 4 개일 때에는 Record4 을 이용해서 결과를 fetch() 을 통해서 받을 수 있습니다. 하지만, 많이 사용되는 MyBatis 에서도 HashMap 이나 POJO(VO, DTO 등) 형태로 결과를 저장하는게 일반적으로, JPA 에서도 @Entity 로 선언된 POJO 에 바로 결과를 저장하는 것이 일반적입니다. 내부적으로는 Reflection 을 이용하겠죠.


당연히 JOOQ 에서도 POJO 에 바로 저장할 수 있는 기능을 제공합니다.

먼저 앞선 예제의 질의를 그대로 사용한다는 가정 하에 Record3<String, String, Integer> 대신에 저장될 DTO 을 하나 만듭니다. 코드의 축약을 위해 Lombok 을 이용합니다.


1
2
3
4
5
6
7
8
9
10
11
12
package com.zepinos.blog.jooq.dto;
 
import lombok.Data;
 
@Data
public class NameCountDto {
 
    private String firstName;
    private String lastName;
    private int count;
 
}


그리고 기존 소스의 Dao 을 아래와 같이 수정합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.zepinos.blog.jooq.dao;
 
import com.zepinos.blog.jooq.dto.NameCountDto;
import org.jooq.DSLContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
 
import java.util.List;
 
import static com.zepinos.blog.jooq.generated.tables.Author.AUTHOR;
import static com.zepinos.blog.jooq.generated.tables.Book.BOOK;
import static com.zepinos.blog.jooq.generated.tables.Language.LANGUAGE;
import static org.jooq.impl.DSL.count;
 
@Repository
public class JooqBoardDao {
 
    private final DSLContext create;
    private final JdbcTemplate jdbcTemplate;
 
    @Autowired
    public JooqBoardDao(DSLContext create, JdbcTemplate jdbcTemplate) {
        this.create = create;
        this.jdbcTemplate = jdbcTemplate;
    }
 
    public List<NameCountDto> list() {
 
 
        List<NameCountDto> nameCountDtoList = create
                .select(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, count().as("count"))
                .from(AUTHOR)
                .join(BOOK)
                .on(AUTHOR.ID.eq(BOOK.AUTHOR_ID))
                .join(LANGUAGE)
                .on(BOOK.LANGUAGE_ID.eq(LANGUAGE.ID))
                .where(LANGUAGE.CD.eq("en").and(BOOK.PUBLISHED_IN.gt(1946)))
                .groupBy(AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
                .having(count().gt(0))
                .orderBy(AUTHOR.LAST_NAME.asc())
                .limit(1)
                .offset(0)
                .fetchInto(NameCountDto.class);
 
        return nameCountDtoList;
 
    }
 
}


이전보다 코드가 매우 간결해졌음을 알 수 있습니다. fetch() 대신에 fetchInfo() 을 이용해 저장될 POJO class 을 지정하면 됩니다.


물론 위 예제에서 return 되는 형태도 변경되기 때문에 Service 파일도 형태를 바꿔줘야 합니다. 하지만, 실행 결과는 동일함을 확인할 수 있습니다.


2019/03/22 - [Programming/JQuery] - [JOOQ-06] 올바른 질의를 작성하게 도와주는 방법


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함