2016-08-30 91 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实例文档,因此这可能会很好地道。

希望有帮助。