티스토리 뷰

반응형

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 을 이용합니다.


package com.zepinos.blog.jooq.dto;

import lombok.Data;

@Data
public class NameCountDto {

	private String firstName;
	private String lastName;
	private int count;

}


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


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
«   2024/04   »
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
글 보관함