如何通过jooq中的连接选择自动生成的记录和附加数据?

时间:2014-11-03 14:42:32

标签: java jooq

假设您有两个表foobar以及一个与foo匹配的表,以允许bar s:

foo             bar
+----+-------+  +----+-------+
| id |fooName|  | id |barName|
+------------+  +----+-------+
| 1  | aa    |  | 10 |  xx   |
| 2  | bb    |  | 11 |  yy   |
| 3  | cc    |  | 12 |  zz   |
+------------+  +----+-------+

n:m foobar

之间的关系
foo_x_bar
+--------+--------+
| foo_id | bar_id |
+-----------------+
| 1      |  10    |
| 1      |  11    |
| 2      |  11    |
| 3      |  12    |
+-----------------+

现在,鉴于任何foo.id(说1),我想要一个所有 bar的列表,以及它们是否适用于foo.id 1。我可以用这个SQL做到这一点:

SELECT bar.id, bar.barName, foo_x_bar.foo_id 
FROM bar LEFT OUTER JOIN foo_x_bar
ON bar.id = foo_x_bar.bar_id AND foo_x_bar.foo_id = 1;  

这给了我以下结果:

+--------+-------------+------------------+
| bar.id | bar.barName | foo_x_bar.foo_id |
+--------+-------------+------------------+
|   10   |   xx        |       1          |
|   11   |   yy        |       1          |
|   12   |   zz        |      null        |
+--------+-------------+------------------+

I.e。:我得到bar的完整列表,并知道foo引用了id 1。 (未引用null foo_id的所有行

现在(最后)回答我的问题:如何用jooq实现这一点,所以我得到了很好的BarRecord类jooq自动生成给我。这是我得到了多远:

List<Record3<Long, String, Long>> result = 
create.select(BAR.ID, BAR.BARNAME, FOO_X_BAR.FOO_ID)
.from(BAR).leftOuterJoin(FOO_X_BAR)
.on(BAR.ID.eq(FOO_X_BAR.BAR_ID))
.and(FOO_X_BAR.FOO_ID.eq(fooId))
.fetch();

这一切都很好,但如果Bar恰好有更多列,这会变得乏味,我想为我使用BarRecord类jooq autogenerates。

如何获得Record2<BarRecord, Long>

===============编辑==============

根据下面的正确答案,这是我们提出的完整代码:

public static class BarMapper 
implements RecordMapper<Record, Pair<BarRecord, Boolean>> {
    //the boolean indicates if a matching FOO is present
    return new Pair<BarRecord, Boolean>(
        record.into(BAR), 
        record.getValue(FOO_X_BAR.FOO_ID) != null);
}

public List<Pair<BarRecord, Boolean>> selectBarsForFooId(final long fooId) {
    create.select(BAR.fields()).select(FOO_X_BAR.FOO_ID)
    .from(BAR).leftOuterJoin(FOO_X_BAR)
    .on(BAR.ID.eq(FOO_X_BAR.BAR_ID))
    .and(FOO_X_BAR.FOO_ID.eq(fooId))
    .fetch(new BarMapper());
}

1 个答案:

答案 0 :(得分:3)

你可以写:

create.select(BAR.fields())
      .select(FOO_X_BAR.FOO_ID)

BAR.fields()或多或少与SQL中的BAR.*相同。

您目前(截至jOOQ 3.4)无法通过jOOQ API在结果中生成嵌套记录。这是待处理的功能请求:

为了将(部分)记录映射到排版良好的BarRecord,您只需拨打Record.into(Table)

BarRecord bar = Record.into(BAR);