假设您有两个表foo
和bar
以及一个与foo
匹配的表,以允许bar
s:
foo bar
+----+-------+ +----+-------+
| id |fooName| | id |barName|
+------------+ +----+-------+
| 1 | aa | | 10 | xx |
| 2 | bb | | 11 | yy |
| 3 | cc | | 12 | zz |
+------------+ +----+-------+
n:m foo
和bar
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());
}
答案 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);