在 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);
我正在对 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);