JOOQで同じタイプの結合されたテーブルをマッピング

マヌエル・ベルナール:

私は、次のクエリを持っています:

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から取得することRecordMap<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番目をマッピングしたいと思いますUserOptional、それは周りではないかもしれないからです。

ルーカス・エダー:

あなたのエイリアスに必要な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))

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=208037&siteId=1