java - Jooq实体映射

标签 java sql jooq

我有以下架构:

项目(ID、名称) 项目_用户 (PROJECT_ID, USERS_ID) 用户(姓名、ID)

实体如下

public class Projects {

    private String name;
    private long id;
    private List<User> users;

    public Projects() {
    }
}


public class User {

    private String name;
    private Long id;
}

很明显一对多。项目可以有多个用户。

现在我的目标是编写 jooq 查询,我可以在其中获取已有相应用户的项目对象。

.select(PROJECT.NAME, PROJECT.ID, USERS)
.from(PROJECT)
.join(USERS_PROJECT).on(USERS_PROJECT.PROJECT_ID=PROJECT.ID)
.join(USERS).on(USERS.ID=USERS_PROJECT.USER_ID)
.fetchInto(Project.class);

但查询会在预期 ~15 时返回 thousends 结果

最佳答案

你在做两件事:

运行 jOOQ 查询:

.select(PROJECT.NAME, PROJECT.ID, USERS)
.from(PROJECT)
.join(USERS_PROJECT).on(USERS_PROJECT.PROJECT_ID.eq(PROJECT.ID))
.join(USERS).on(USERS.ID.eq(USERS_PROJECT.USER_ID))
.fetch();

这很简单。 jOOQ 将上述表达式转换为 SQL 字符串,将其发送到 JDBC,接收结果集并为您提供一个 jOOQ Result .显然,结果是非规范化的(因为您编写了联接),因此您有很多行(大约与 USERS_PROJECT 表中的行一样多)。

Result 映射到您的 POJO

现在,这就是让您感到困惑的地方。您调用了 fetchInto(Project.class),这只是调用 fetch() 的语法糖. into(Class) .这是两个独立的步骤,特别是 into(Class) 步骤不知道您的查询,也不知道您的意图。因此,它不会“知道”您期望 ~15 个独特的项目和嵌套的用户集合。

但是有一些方法可以更明确地映射事物。例如。通过使用 intoGroups(Class, Class) .这可能不会像您设计的那样返回嵌套类型,而是像

Map<Person, List<User>> map = query.fetch().intoGroups(Person.class, User.class);

您可以从那里手动获取它。或者,您可以写一个 RecordMapper并使用它:

List<Person> list = query.fetch().map(record -> new Person(...));

或者,您可以使用 recommended third party mappers 中的任何一个,例如:

关于java - Jooq实体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43739761/

相关文章:

java - 为什么转换JSON RESTful Webservice后,POJO中的某些变量等于null?

php - SQL : many Many MANY tables vs one huge table? 哪个更快

java - 注入(inject)的 JOOQ 上下文泄漏连接

java - jOOQ 和 PostgreSQL : mapping nested json object extracted from complex jsonb into custom type

java - 在 Jetty 服务器 v 9.2.2 上运行 JSP 时出错

java - SQLException 结果集结束后

SQL - 根据条件将某些列设置为空

postgresql - 从选择中获取时的 jOOQ 和 StackOverflowException

java - invokeAll 的参数(集合)是否取决于队列大小?

mysql - 为什么 MySQL 要求参数按特定顺序排列?