2017-03-08 9 views
3

私はJOOQを試していて、結合ステートメントを使用して3つのテーブル(著者、書籍、記事)から選択しようとしています。次のようにERDは次のとおりです。Jooqで1対多選択

Author ----< Books 
    | 
    | 
^
Articles 

私が持っているクエリは以下の通りです:

message Author { 
    int64 id = 1; 
    string name = 2; 
    repeated string books = 3; 
    repeated string articles = 4; 
} 

(またはのために他のPOJOを次のように私もいるProtobufオブジェクトを持っている

final List<Tuple3<AuthorRecord, BooksRecord, ArticlesRecord>> tupleList = 
     persistenceContext.getDslContext() 
      .select() 
      .from(Author.AUTHOR) 
      .join(Books.BOOKS) 
      .on(Author.AUTHOR.ID.eq(Books.BOOKS.AUTHOR_ID)) 
      .join(Articles.ARTICLES) 
      .on(Author.AUTHOR.ID.eq(Articles.ARTICLES.AUTHOR_ID)) 
      .where(Author.AUTHOR.ID.eq(id)) 
      .fetch() 
      .map(r -> Tuple.tuple(r.into(Author.AUTHOR).into(AuthorRecord.class), 
       r.into(Books.BOOKS).into(BooksRecord.class), 
       r.into(Articles.ARTICLES).into(ArticlesRecord.class))); 

すべての実体(著者の詳細+書籍のリスト+記事のリスト)を1つのオブジェクトに保持することになります。私の質問は、JOOQを使用して1つのオブジェクトに3つのテーブルすべてをマップする方法があるかどうかです。

ありがとうございます。

+0

希望の結果のタイプをもう少し詳しく説明できますか(私はprotobufを知らない)。 '繰り返し文字列'は、 '' book1、book2、...、bookN "'のようなコンマ区切りの連結文字列のようですか?それとももっと配列に似ていますか? –

+0

ありがとう@LukasEder protobufから生成された著者クラスは、書籍/記事のリストにゲッターを持っています。 protobufについてもっと知りたい場合は、[こちら](https://developers.google.com/protocol-buffers/docs/javatutorial)をご覧ください。理想的なケースでは、結合クエリは私にProtobufAuthorまたはList を与えます。 実際には、以下に示唆したように何かをしました。ご助力ありがとうございます! –

+0

フィードバックいただきありがとうございます。知っておくといい。あなたは自分の答えで何をしたかを見せてもらえますか? (Stack Overflowに関する自分の質問に答えることはまったく問題ありません)。私はあなたがそれをどうやって行ったのかとても興味があります。 –

答えて

2

この方法で結合を使用している場合は、書籍と記事テーブルの間にcartesian productを作成するため、データベースとJavaの両方でかなりのメモリとCPU消費が発生するため、クエリはかなり非効率的になりますすべての無意味な組み合わせを重複しないようにしてください。

「正しい」SQLのアプローチは、MULTISET as described in this article hereを使用することです。残念ながらjOOQ 3.9 doesn't support MULTISET yet(データベースも多数ありません)。その後、すべての記事

そして、1つのオブジェクトにそれらをマッピングするためにJavaの8つのストリームのようなものを使用するのフェッチすべての書籍

  • をフェッチ

    1. :だから、あなたは、2つの別々のクエリを作成する必要があります。

  • 関連する問題