2016-08-30 47 views
0

我是新來的使用JOOQ和我有問題,但我找不到解決方案。我有2張表簡單的數據庫:SellersClients - 下面的SQL: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被分配給他。

我想從使用JOOQ的數據庫獲取客戶端,但使用join()也得到Seller對象到每個客戶端。可能嗎?如果是這樣怎麼辦?這裏是我的POJO對象:

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 
    ... 
} 

這是我的JOOQ代碼來獲取客戶:

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

我應該改變讓我想要什麼?

+0

'客戶'有'賣家'作爲對象。數據庫將'seller_id'作爲'int'。 JOOQ會自動解決嗎? – bradimus

+0

@bradimus它將seller_id自動解析爲int,但正如您在我的客戶端類中所看到的,我也試圖添加對象賣家賣家,但它沒有解決它。 – user3626048

回答

1

查看Lukas Eder(jOOQ的作者)和其他一些jOOQ用戶之間的對話here。 Garrett Wilson的使用案例與您的使用案例非常相似(您有ClientSeller,他有BookAuthor)。

這裏有很多的說法,但從設計上看,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. 定義自定義記錄映射器您jOOQ Record映射到您的域名類型/ POJO
  2. 定義自定義RecordMapperProvider,並用它來創建得到(例如,通過依賴注入)
  3. 使用上述DSLContext各地傳遞到任何部件做你的查詢DSLContext單身,譜寫ÿ我們的查詢,並使用fetchInto()指定目標類型(應該在你的RecordMapperProvider被佔)
前面引用的談話

,盧卡斯滴link約使用自定義RecordMapperProvider實例文檔,因此這可能會很好地道。

希望有幫助。