在jooQ中使用Left Join自定义POJO

roh*_*was 2 java join left-join jooq

我正在进行表A和表B的左连接,并尝试将结果提取到自定义POJO中,其中包含表A和表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);
Run Code Online (Sandbox Code Playgroud)

除了myCode这两个表连接的字段之外,它适用于所有字段.对我来说,myCode的值是从右表中获取的,表B,对于表A中所有那些在表B中没有相应条目的记录都是NULL.我想知道jooQ如何决定哪个字段为映射到POJO并在任何地方记录此行为.

我的目标是将表A和表B中的所有字段提取到自定义POJO中,以便从左表中获取myCode.我很感激你就正确的方法提出建议.

Luk*_*der 6

ResultQuery.fetchInto(Class)(以及大多数其他into(Class)方法)的默认行为在中指定DefaultRecordMapper.它可以通过在您的网站中提供自定义RecordMapperProvider来覆盖全局Configuration.

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

不要选择"错误"的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);
Run Code Online (Sandbox Code Playgroud)

RIGHT JOIN改为使用:

也许有点像黑客,但这会迅速扭转你SELECT声明中的表顺序.

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

最后一个用例RIGHT JOIN:)

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

再次添加"正确的" 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);
Run Code Online (Sandbox Code Playgroud)