Jooq实体映射
Jooq entity mapping
我有以下架构:
项目(ID、名称)
Projects_Users (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
table 中的行一样多)。
将 Result
映射到您的 POJO
现在,这就是让您感到困惑的地方。您调用了 fetchInto(Project.class)
,这只是调用 fetch()
.into(Class)
的语法糖。这是两个独立的步骤,特别是 into(Class)
步骤不知道您的查询,也不知道您的意图。因此,"know" 您并不期望有 ~15 个独特的项目和嵌套的用户集合。
但是有一些方法可以更明确地映射事物。例如。通过使用 intoGroups(Class, Class)
。这可能不是您设计的 return 嵌套类型,而是类似于
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,例如:
我有以下架构:
项目(ID、名称) Projects_Users (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
table 中的行一样多)。
将 Result
映射到您的 POJO
现在,这就是让您感到困惑的地方。您调用了 fetchInto(Project.class)
,这只是调用 fetch()
.into(Class)
的语法糖。这是两个独立的步骤,特别是 into(Class)
步骤不知道您的查询,也不知道您的意图。因此,"know" 您并不期望有 ~15 个独特的项目和嵌套的用户集合。
但是有一些方法可以更明确地映射事物。例如。通过使用 intoGroups(Class, Class)
。这可能不是您设计的 return 嵌套类型,而是类似于
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,例如: