マヌエル・ベルナール:
私は、次のクエリを持っています:
sql
.select()
.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
.join(USERS).on(ITEMSOWNERS.OWNER_ID.eq(USERS.ID))
.leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))
.join(USERS).on(ITEMSREVIEWERS.REVIEWER_ID.eq(USERS.ID))
.where(PUBLIC_ID.eq(publicId))
.fetchGroups(WALLETS)
私は、の2種類があることを考慮して、タプル形式のいくつかの種類には、これらのバックを取得したいのですUSERS
つまり、私は一種の構造を持っている、結果はこちら:
- ITEMS (given the `WHERE` clause there should be only one of those at most, though)
- OWNERS
- REVIEWERS
私は私が使用できることを知っていると思うfetchGroups
から取得することRecord
にMap<Item, Record>
、私はかなり確実で結果として生じるに関してでさらに続行する方法はないですRecord
含まれている必要がありますUser
すなわち、二回
innerRecord.into(USERS) // this should work okay, I guess
innerRecord.into(USERS) // how to make this happen on the "second" set of User columns?
理想的には私は2番目をマッピングしたいと思いますUser
にOptional
、それは周りではないかもしれないからです。
ルーカス・エダー:
あなたのエイリアスに必要なUSERS
テーブル。あなたは二度同じテーブルに参加している場合、これは、(関係なく、あなたがjOOQを使用している場合)SQLで一般的に良いアイデアです。
val owners = USERS.as("owners");
val reviewers = USERS.as("reviewers");
sql
.select()
.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))
.leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))
.join(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))
.where(PUBLIC_ID.eq(publicId))
.fetchGroups(WALLETS)
その後、のような明示的に2つのテーブルのカラムにアクセスすることができます:
innerRecord.into(owners)
innerRecord.into(reviewers)
理想的には私はそれが周りではないかもしれないので、オプションの中に第二のユーザをマッピングしたいと思います。
jOOQには、このような方法はありません。次のように明示的にラップ:
Optional.of(innerRecord.into(reviewers))
SQL正確性に関する注意
私はあなたのSQLクエリが正しいとは思いません。グラフに参加するには、いずれかの左あなたのレビューのテーブルを結合する必要があります。
.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))
.leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))
.leftJoin(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))
...または、次のように参加するの巣:
.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))
.leftJoin(ITEMSREVIEWERS
.join(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))
).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))