在jOOQ中,如果我想将表的一行获取到jOOQ自动生成的POJO中,我会这样做,例如:
dsl.selectFrom(USER)
.where(USER.U_EMAIL.equal(email))
.fetchOptionalInto(User.class);
现在,假设我想在两个表之间进行连接,例如USER
和ROLE
,如何将结果获取到这两个表的POJO中?
继续Lukas Eder的回答:
若您需要列表结构作为回报,或者无法在POJO中验证equals或哈希代码,则可以将其提取到列表中
List<Pair<UserPojo, RolePojo>> result = dsl.select(USER.fields())
.select(ROLE.fields())
.from(USER)
.join(USER_TO_ROLE).on(USER.USER_ID.eq(USER_TO_ROLE.USER_ID))
.join(ROLE).on(ROLE.ROLE_ID.eq(USER_TO_ROLE.ROLE_ID))
.where(USER.U_EMAIL.equal(email))
.fetch(record -> {
UserPojo userPojo = r.into(USER).into(UserPojo.class);
RolePojo rolePojo = r.into(ROLE).into(RolePojo.class);
return new ImmutablePair<>(zoneEntity, userEntity);
});
这是一个使用ResultQuery.fetch组(RecordMapper, RecordMapper)的解决方案。
Map<UserPojo, List<RolePojo>> result =
dsl.select(USER.fields())
.select(ROLE.fields())
.from(USER)
.join(USER_TO_ROLE).on(USER.USER_ID.eq(USER_TO_ROLE.USER_ID))
.join(ROLE).on(ROLE.ROLE_ID.eq(USER_TO_ROLE.ROLE_ID))
.where(USER.U_EMAIL.equal(email))
.fetchGroups(
// Map records first into the USER table and then into the key POJO type
r -> r.into(USER).into(UserPojo.class),
// Map records first into the ROLE table and then into the value POJO type
r -> r.into(ROLE).into(RolePojo.class)
);
注意,如果您想改用左连接(如果用户不一定有任何角色,并且您希望每个用户获得一个空列表),您必须自己将角色转换为空列表。
确保已在POJO上激活生成equals()
和hashCode()
,以便能够将它们作为键放入哈希映射中:
<pojosEqualsAndHashCode>true</pojosEqualsAndHashCode>
一个经常重复出现的问题是如何在jOOQ中获取嵌套集合,即,如果结果数据结构如下所示,该怎么办:
class User {
long id;
String email;
List<Role> roles;
}
class Role {
long id;
String name;
}
从jOOQ 3.14开始,如果您的RDBMS支持它,您现在可以使用SQL /XML或SQL /JSON作为嵌套集合的中间格式,然后使用Jackson、Gson或JAXB将文档映射回您的Java类(或者保留XML或JSON,如果这是您首先需要的)。例如:
List<User> users =
ctx.select(
USER.ID,
USER.EMAIL,
field(
select(jsonArrayAgg(jsonObject(ROLE.ID, ROLE.NAME)))
.from(ROLES)
.join(USER_TO_ROLE).on(ROLE.ROLE_ID.eq(USER_TO_ROLE.ROLE_ID))
.where(USER_TO_ROLE.USER.ID.eq(USER.ID))
).as("roles")
)
.from(USER)
.where(USER.EMAIL.eq(email))
.fetchInto(User.class);
请注意,JSON_ARRAYAGG()
将空集聚合到NULL
中,而不是空[]
中。如果有问题,请使用COALESCE()
问题内容: 在jOOQ中,如果我想将一张表的行提取到jOOQ自动生成的POJO中,例如: 现在,假设我想在两个表之间进行联接,例如和,如何将结果提取到这两个表的POJO中? 问题答案: 这是使用 请注意,如果您要改用(如果用户不一定具有任何角色,并且希望每个用户获得一个空列表),则必须自己将角色转换为空列表。 确保已激活生成和POJO,以便能够将它们作为as键:
我正在做表A和表B的左连接,并试图将结果提取到自定义POJO中,该POJO具有表A和表B中的字段,如下所示: 它适用于除myCode字段之外的所有字段,myCode字段是连接这两个表的字段。对我来说,myCode的值是从正确的表B中获取的,表A中的所有记录在表B中都没有相应的条目。我想知道jooQ如何决定映射到POJO的字段,以及是否在任何地方记录了这种行为。 我的目标是将表A和表B中的所有字段提
我在这里浏览了关于在Jooq中将记录提取到可变pojo中的文档。 它说列被映射到最佳匹配的构造函数、属性或setter。 谁能分享更多的信息最佳匹配属性或setter意味着什么?
我正在运行以下JOOQ查询: table和joinTable都有id作为主键名称,但最终获取实体类包含joinTable的id和table的其余列。如果我重新排序表,结果相似,我有表的ID和joinTable的其余列。
我正在使用< code>MapStruct,为此我必须定义一个具有相应映射函数的接口。通过使用用< code > @ before mapping < code > 和@AfterMapping注释的< code>default方法,可以实现一些逻辑。在这样一个带注释的默认方法中,我想使用我的SpringBoot应用程序的一个配置类。我该怎么做?我可以将这样的配置(bean)自动连接到接口吗?这样
我正在jOOQ中执行一个普通的sql查询,并希望将其映射到jOOQ生成的pojo中。我希望我能做这样的事情: 然而,这是行不通的。字段不会映射到构建所需的类型,因为字段定义是DB列的定义,而不是FOO表的映射类型。目前我的代码看起来像这样: 是否有某种方法可以为结果查询提供我正在获取的s,以便它能够正确映射结果?我希望在某个地方有这样的能力: 但是我找不到它。这是我忽略的东西还是不支持的? 作为参