在 jooQ 中使用 Left Join 自定义 POJO

Custom POJO with Left Join in jooQ

我正在对 Table A 和 Table B 进行左连接,并尝试将结果提取到自定义 POJO 中,该 POJO 具有来自 Table A 和 Table B 如下:

List<MyCustomPojo> res = create.select()
                         .from(TABLE_A)
                         .leftJoin(TABLE_B)
                         .on(TABLE_A.MY_CODE.eq(TABLE_B.MY_CODE))
                         .fetchInto(MyCustomPojo.class);

除了 myCode 这两个 table 连接的字段外,它对所有字段都适用。对我来说,myCode 的值是从右侧 table、Table B 中提取的,对于 Table A 中的所有这些记录都是 NULL在 Table B 中没有相应的条目。我想知道 jooQ 如何决定将哪个字段映射到 POJO 以及是否在任何地方记录了这种行为。

我的目标是将 Table A 和 Table B 中的所有字段提取到自定义 POJO 中,以便从左侧拾取 myCode table。如果您能就正确的实现方式提出建议,我将不胜感激。

ResultQuery.fetchInto(Class) (and most other into(Class) methods) is specified in DefaultRecordMapper. It can be overridden globally by providing a custom RecordMapperProvider 在您的 Configuration 中的默认行为。

在您的特定情况下,DefaultRecordMapper 将按字段顺序映射您记录中的所有值。如果某个列出现两次,它将被映射两次,这意味着第二个值将保留在您的结果对象中。有两个简单的解决方法:

不要 select "wrong" myCode。这确实是最稳健的解决方案

List<MyCustomPojo> res = create
    .select(TABLE_A.fields())
    .select(/* all fields in TABLE_B except the ones you don't want */)
    .from(TABLE_A)
    .leftJoin(TABLE_B)
    .on(TABLE_A.MY_CODE.eq(TABLE_B.MY_CODE))
    .fetchInto(MyCustomPojo.class);

改用RIGHT JOIN

可能有点乱七八糟,但这会迅速反转您 SELECT 语句中的 table 顺序。

List<MyCustomPojo> res = create
    .select()
    .from(TABLE_B)
    .rightJoin(TABLE_A)
    .on(TABLE_A.MY_CODE.eq(TABLE_B.MY_CODE))
    .fetchInto(MyCustomPojo.class);

最后 RIGHT JOIN 的 use-case :)

请注意,这是唯一的解决方案,它还可以防止 "accidentally" 共享相同名称的其他列的错误值。

再次添加 "correct" myCode 字段。

另一个技巧,但它可以解决您遇到的问题:

List<MyCustomPojo> res = create
    .select(TABLE_A.fields())
    .select(TABLE_B.fields())
    .select(TABLE_A.MY_CODE)
    .from(TABLE_A)
    .leftJoin(TABLE_B)
    .on(TABLE_A.MY_CODE.eq(TABLE_B.MY_CODE))
    .fetchInto(MyCustomPojo.class);