티스토리 뷰
반응형
2019/03/21 - [Programming/JOOQ] - [JOOQ-05] 객체(Object)에 질의 결과 저장하기
JOOQ 는 Java 코드를 SQL 로 에뮬레이트 해주는 DSL 의 성격을 가지고 있습니다. 그래서 C# 의 LINQ 와 유사하게 코드를 작성할 수 있고, 작성된 코드의 문법적 문제를 어느 정도 예방할 수도 있습니다.
그 의미를 알기 위해 아래와 같은 간단한 질의를 Java 코드로 변경해보겠습니다.
SELECT * FROM author a JOIN book b ON a.id = b.author_id WHERE a.year_of_birth > 1920 AND a.first_name = 'Paulo' ORDER BY b.title
위 질의는 다음과 같이 작성될 수 있습니다.
Author a = AUTHOR.as("a"); Book b = BOOK.as("b"); Result<Record> result = create.select() .from(a) .join(b).on(a.ID.eq(b.AUTHOR_ID)) .where(a.YEAR_OF_BIRTH.gt(1920) .and(a.FIRST_NAME.eq("Paulo"))) .orderBy(b.TITLE) .fetch();
이러한 코드를 생성할 때 특정한 DBMS 에 종속적인 형태보다는 JOOQ 의 비공식적인 BNF 표기법이라는 것을 이용합니다. 이러한 표기법을 바탕으로 아래와 같은 오류를 사전에 방지할 수 있습니다.
Result<?> result = create.select() .join(BOOK).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID)) // from() 전에 join() 이 먼저 나올 수 없습니다. IDE 에서 .join() 이 나오지 않기도 하고, 컴파일 시 오류가 발생합니다. .from(AUTHOR) .fetch(); Result<?> result = create.select() .from(AUTHOR) .join(BOOK) .fetch(); // join() 다음에 on() 이 없기 때문에 .fetch() 가 자동완성 되지 않거나 컴파일 시 오류가 발생합니다. Result<?> result = create.select(rowNumber()) // rowNumber() 다음에 over() 가 나와야 문장이 완성되는데 그렇지 않기 때문에 컴파일 시 오류가 발생합니다. .from(AUTHOR) .fetch(); Result<?> result = create.select() .from(AUTHOR) .where(AUTHOR.ID.in(select(BOOK.TITLE).from(BOOK))) // AUTHOR.ID 는 Integer 인데 BOOK.TITLE 은 String 이기 때문에 컴파일 시 오류가 발생합니다. .fetch(); Result<?> result = create.select() .from(AUTHOR) .where(AUTHOR.ID.in(select(BOOK.AUTHOR_ID, BOOK.ID).from(BOOK))) // AUTHOR.ID 는 하나의 컬럼인데 복수의 컬럼이 서브쿼리에서 제공되는 것을 감지하여 컴파일 시 오류가 발생됩니다. .fetch();
이렇듯, JOOQ 을 사용하게 되면 질의를 그대로 옮겨서 작성하지 않고 직접 Java 코드를 작성하더라도 문법적 문제의 일부를 바로잡을 수 있습니다.
2019/03/27 - [Programming/JOOQ] - [JOOQ-07] CTE 구현 방법
반응형
'Programming > JOOQ' 카테고리의 다른 글
[JOOQ-07] CTE 구현 방법 (0) | 2019.03.27 |
---|---|
[JOOQ-05] 객체(Object)에 질의 결과 저장하기 (0) | 2019.03.21 |
[JOOQ-04] 좀 더 복잡한 질의 실행해보기 (0) | 2019.03.05 |
[JOOQ-03] 테스트 DB 을 생성하고 JOOQ 객체 생성하기 (0) | 2019.03.05 |
[JOOQ-02] JOOQ 에 대해서 좀 더 알아보기 (0) | 2019.03.01 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Spring Boot
- Phabricator
- KDE
- boot
- SI
- jooq
- 프로젝트 규모
- Spring MVC
- manjaro
- Redmine
- RestTemplate
- docker
- java config
- 내장 WAS
- 엘지
- 도입기
- Spring
- proxmox
- paging
- messages.properties
- 시니어 프로그래머
- couchbase
- 외장 WAS
- Nas
- 워드프레스
- 클라우드플레어
- git
- 페이징
- OracleJDK
- NoSQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함