Jooq 自动映射包含 1:N 关系的 1:1 关系

问题描述 投票:0回答:1

我有以下 DTO:

  • 产品DTO

  • 用户DTO

  • 用户角色DTO:

  • 我需要获取产品列表,每个产品都有一个字段“creatorId”(可为空)。

    • 对于creatorId我需要获取对应的User(1:1关系),
      • 对于这个用户,我需要获取他的角色(1:N关系)

产品 -> 1:1 -> 用户 -> 1:N -> 用户角色


我让它与以下 jooq 查询一起使用:

dsl()
    .select(
            asterisk(),
            multiset(
                    selectDistinct(
                            asterisk()
                    )
                            .from(UserRole.USER_ROLE)
                            .where(UserRole.USER_ROLE.USERID.eq(Product.PRODUCT.CREATORID))
            ).as("roles")),
    .from(Product.PRODUCT)
        .leftJoin(User.USER)
        .on(User.USER.USERID.eq(Product.PRODUCT.CREATORID))
    .where(...)
    .groupBy(Product.PRODUCT.PRODUCTID)
    .orderBy(...)
    .offset(...)
    .limit(...)
    .fetch().map(new RecordMapper<Record, ProductDTO>() {
        @Override
        public @Nullable ProductDTO map(Record record) {
            ProductDTO product = rec.into(ProductDTO.class);
            UserDTO creator = rec.into(UserDTO.class);
            List<UserRoleDTO> creatorRoles = rec.get("roles", Result.class).into(UserRoleDTO.class);
            creator.setRoles(creatorRoles);
            product.setCreator(creator);

            return product;
        }
    });

现在我的问题:

在没有显式“RecordMapper”部分的情况下,这种映射也可以“隐式”吗?

我已经很满意我能做到这一点,因为我只找到了使用具有直接 1:N 关系的多重集的示例,但我这里拥有的是 1:1 关系,(在更深层次上)还包含 1:N 关系.


通常可以创建两个单独的 SELECT 语句,但对于我的用例(带过滤的远程分页),所有这些都是必要的!关系在一个 SELECT 语句中处理,因此我可以使用连接语句对查询进行额外过滤。

jooq multiset
1个回答
0
投票

在 Lukas Eder 的帮助下(见上文)和临时转换器的链接示例页面(请参阅:https://www.jooq.org/doc/latest/manual/sql-execution/fetching/ad-hoc -converter/)我已经“隐式”解决了多集案例(不需要后处理 RecordMapper)。

multiset(
        selectDistinct(
                asterisk()
        )
                .from(UserRole.USER_ROLE)
                .where(UserRole.USER_ROLE.USERID.eq(Product.PRODUCT.CREATORID))
).as("roles").convertFrom(r -> r.into(UserRole.USER_ROLE).into(UserRoleDTO.class)),

1:1(创作者)关系的另一个案例仍然悬而未决。我仍在努力寻找一种方法来使用具有这种 1:1 关系的临时映射器。

我尝试以下操作但没有成功,因为它产生了 sql 错误:

select(
...
asterisk(),
User.USER.convertFrom(r -> into(User.USER).into(UserDTO.class)).as("creator"),
multiset(...),
...
)
Caused by: java.sql.SQLSyntaxErrorException: (conn=2014) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.userId,
    testshop.user.clientId as v20.clientId,
    testshop.user.email ...' at line 24
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.