当前位置: 首页 > 知识库问答 >
问题:

jOOQ我可以把两个表的连接取到各自的pojo中吗

司空胤
2023-03-14

在jOOQ中,如果我想将表的一行获取到jOOQ自动生成的POJO中,我会这样做,例如:

dsl.selectFrom(USER)
                .where(USER.U_EMAIL.equal(email))
                .fetchOptionalInto(User.class);

现在,假设我想在两个表之间进行连接,例如USERROLE,如何将结果获取到这两个表的POJO中?

共有2个答案

罗甫
2023-03-14

继续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);
            });
谭山
2023-03-14

这是一个使用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,以便它能够正确映射结果?我希望在某个地方有这样的能力: 但是我找不到它。这是我忽略的东西还是不支持的? 作为参