gpt4 book ai didi

java - JOOQ 使用另一个 POJO 获取 POJO 对象 - 表中的外键

转载 作者:行者123 更新时间:2023-12-01 09:33:05 24 4
gpt4 key购买 nike

我是 JOOQ 的新手,遇到问题但找不到解决方案。我有一个简单的数据库,有 2 个表:SellersClients - 下面的 sql:

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)
);

Client外键,它定义了分配给他的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);

我应该改变什么才能得到我想要的东西?

最佳答案

查看对话 here Lukas Eder(jOOQ 的作者)和其他一些 jOOQ 用户之间的关系。 Garrett Wilson 的用例看起来与您的非常相似(您有 Client : Seller ,他有 Book : Author )。

说了很多,但从设计上看,jOOQ 似乎并不适合自动给 Seller 补水。您获取的 Client 中的实例记录。这是与 ORM 相关的经典 N+1 问题(即由客户查询触发对卖家表的多个查询)。

一个建议是将连接分解为离散查询:

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

...然后做你的client.setSeller()在应用程序的某处输入逻辑。在这种情况下,您可以避免 N+1 问题,并且不需要依赖编写自定义的 any RecordMapper类型。

我不是 jOOQ 专家,但是当我在一个查询中返回分层类型的列时,我过去使用的方法对我来说效果很好:

  1. 定义自定义记录映射器来映射您的 jOOQ Record到您的域类型/POJO
  2. 定义自定义 RecordMapperProvider并用它来创建 DSLContext单例,它被传递到执行查询的任何组件(例如通过依赖项注入(inject))
  3. 使用上述DSLContext ,编写您的查询并使用 fetchInto()指定您的目标类型(应该已在您的 RecordMapperProvider 中说明)

在前面提到的对话中,Lukas 丢下了 link有关使用自定义的文档 RecordMapperProvider实例,所以这很可能是惯用的。

希望有帮助。

关于java - JOOQ 使用另一个 POJO 获取 POJO 对象 - 表中的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39237487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com