2016-08-30 3 views
0

저는 JOOQ를 처음 사용할 때 문제가 있습니다. 그러나 해결책을 찾을 수 없습니다.JOOQ 다른 POJO와 POJO 객체 가져 오기 - 테이블의 외래 키

CREATE TABLE Sellers 
(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name varchar(255) NOT NULL, 
); 


CREATE TABLE Clients 
(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name varchar(255) NOT NULL, 
seller_id int, 
FOREIGN KEY (seller_id) REFERENCES Sellers(id) 
); 

Clientforeign key이 있고 그에게 할당 된 Seller 정의 - 아래 SQL SellersClients : 나는이 개 테이블 간단한 데이터베이스가 있습니다.

나는 클라이언트에서 JOOQ를 사용하여 클라이언트를 얻고 싶지만 join()을 사용하면 각 클라이언트에 Seller 개체를 얻습니다. 가능한가? 그렇다면 그렇게하는 방법? 내 JOOQ 코드가 클라이언트를 얻을 수있어 여기

public class Seller { 
    private final SimpleIntegerProperty id = new SimpleIntegerProperty(); 
    private final SimpleStringProperty name = new SimpleStringProperty(); 

    ... 
    //setters and getters here 
    ... 
} 

public class Client { 
    private final SimpleIntegerProperty id = new SimpleIntegerProperty(); 
    private final SimpleStringProperty name = new SimpleStringProperty(); 
    private final SimpleIntegerProperty sellerId = new SimpleIntegerProperty(); 
    //private Seller seller; //not working 
    ... 
    //setters and getters here 
    ... 
} 

을 : 그리고 여기 내 POJO 객체의

context.select() 
    .from(CLIENTS) 
    .join(SELLERS) 
    .on(CLIENTS.ID.eq(SELLERS.ID)) 
    .fetchInto(Client.class); 

내가 내가 원하는 것을 얻을 변경해야합니까?

+0

'클라이언트'는 '판매자'를 개체로 사용합니다. DB에는'int'로서'seller_id'가 있습니다. JOOQ가 자동으로 해결합니까? – bradimus

+0

@bradimus 판매자 ID를 자동으로 int로 해석하지만 클라이언트 클래스에서 볼 수 있듯이 판매자 셀러를 추가하려고 시도했지만 해결되지 않았습니다. – user3626048

답변

1

Lukas Eder (jOOQ 작성자)와 다른 jOOQ 사용자 사이의 대화 here을 확인하십시오. Garrett Wilson의 유스 케이스는 사용자의 케이스와 매우 비슷합니다 (Client : Seller, Book : Author).

꽤 있지만, 디자인에 따르면 jOOQ는 Client 레코드에서 Seller 인스턴스를 자동으로 수분 공급하는 것으로 보이지 않습니다. 이것은 ORM과 관련된 고전적인 N + 1 문제입니다 (즉, 고객을위한 쿼리에 의해 트리거 된 판매자 테이블에 대한 여러 쿼리).

하나의 제안은 당신이 분리 된 쿼리에 최대 가입 침입하는 것입니다

select * from Client where ... 
select * from Seller where id in (select seller_id from Client where ...) 

... 그리고 응용 프로그램에서 어딘가에 client.setSeller() 유형 로직을한다. 이 경우 N + 1 문제를 피할 수 있으며 RecordMapper 유형을 맞춤 작성하는 데 의존 할 필요가 없습니다.

은 내가 더 jOOQ 전문가는 아니지만, 난 한 쿼리에서 반환되는 계층 유형의 열을했을 때 내가 과거에 사용되는 방법은 나를 위해 꽤 잘 작동 :

  1. 가에 사용자 정의 기록 매퍼를 정의 Y를 구성, 사용자 정의 RecordMapperProvider를 정의 도메인 유형/POJO
  2. 에 jOOQ Record지도 및 상기 DSLContext를 사용
  3. (예 : 의존성 주입을 통해) 귀하의 질의을 어떤 구성 요소 주위에 전달되는 DSLContext 싱글을 만드는 데 사용 우리의 쿼리 및 fetchInto()를 사용합니다 (RecordMapperProvider 회계되어 있어야합니다) 대상 유형 앞서 언급 한 대화에서

를 지정, 루카스는 사용자 정의 RecordMapperProvider 인스턴스를 사용하는 방법에 대한 문서에 link을 삭제, 그래서 이것은 매우 수도 잘 관용적이다.

희망이 도움이됩니다.