Jooq - 如何使用嵌套记录(行)和临时转换查询可空 1:1 关系

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

将 jooq 与嵌套记录一起使用时(请参阅:https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/nested-records/)和临时转换(请参阅:) https://www.jooq.org/doc/latest/manual/coming-from-jpa/from-jpa-manytoone/),我找不到处理“可空 1:1 关系”的好例子”.

以下示例:

  • 产品可以有“编辑器”,但编辑器也可以为 NULL(无编辑器)

我已经尝试过并让它工作,但它似乎有点样板。

...
row(
    PRODUCT.editor().USERID,
    PRODUCT.editor().FIRSTNAME,
    PRODUCT.editor().LASTNAME
).convertFrom(r -> (r.value1() == null) ? null : mapping(UserDTO::new).apply(r)),
...

请注意,我们不需要在此处显式定义

leftJoin
,因为 jooq 默认情况下会为 Path-Expression 使用 Left Join(对于 mariadb 为左外连接)(请参阅“默认 JOIN 类型”:https://www .jooq.org/doc/latest/manual/sql-building/sql-statements/select-statement/implicit-join/),因为我们有“可为空父级”的情况。

如果连接结果中

USERID
列返回NULL,我们可以确定用户表中没有与外键匹配的用户行。

这可以通过

(r.value1() == null) ? null : ...
子句来完成,当第一列 (
USERID
) 返回 NULL 时,该子句返回 NULL。

  • 是否有一个 jooq 函数可以自动解析
    row()
    上的 NULL 值,而无需此处看到的显式转换(也许借助包含 FK 信息的路径表达式)?
  • 我的做法是推荐的做法吗?
jooq
1个回答
0
投票

使用

Functions::nullOnAllNull

.row(...).mapping(nullOnAllNull(UserDTO::new))
© www.soinside.com 2019 - 2024. All rights reserved.