Java Jooq中的一对多选择

Java Jooq中的一对多选择,java,mysql,one-to-many,jooq,Java,Mysql,One To Many,Jooq,我正在试用JOOQ,并尝试使用join语句从3个表(Author、Books和Articles)中进行选择。ERD如下所示: Author ----< Books | | ^ Articles message Author { int64 id = 1; string name = 2; repeated string books = 3; repeated string articles = 4; } (或与此相关的任何其他pojo)

我正在试用JOOQ,并尝试使用join语句从3个表(Author、Books和Articles)中进行选择。ERD如下所示:

Author ----< Books
   |
   |
   ^
Articles
message Author {
    int64 id = 1;
    string name = 2;
    repeated string books = 3;
    repeated string articles = 4;
}
(或与此相关的任何其他pojo)将所有实体(作者详细信息+书籍列表+文章列表)保存到一个对象中。我的问题是,是否有某种方法可以使用JOOQ将所有三个表映射到一个对象中

提前感谢。

使用
JOIN
对此不起作用。 您的查询将非常低效,因为如果您以这种方式使用联接,您将在books和articles表之间创建一个连接,从而在消除所有无意义的组合之前,在数据库和Java客户机中消耗相当多的内存和CPU

“正确”的SQL方法是使用。不幸的是,(许多数据库也不例外)。因此,您应该创建两个单独的查询:

  • 取所有的书
  • 获取所有文章
  • 然后使用Java8流之类的东西将它们映射到单个对象中

    从jOOQ 3.14开始使用SQL/XML或SQL/JSON 幸运的是,从JOOQ3.14开始,如果您的RDBMS支持的话,可以通过SQL/XML或SQL/JSON为这种类型的嵌套集合提供现成的解决方案。您可以生成一个文档,然后使用Gson、Jackson或JAXB之类的工具将其映射回您的Java类。例如:


    List

    您能再描述一下所需的结果类型吗(我不知道protobuf)。
    重复字符串
    是否类似于逗号分隔的串联字符串,如
    “book1,book2,…,bookN”
    ?还是更像一个数组?谢谢@LukasEder,从protobuf生成的author类将有一个书籍/文章列表的getter。如果你想了解更多关于protobuf的信息,可以看一看。因此,在理想情况下,连接查询会给我一个protobufautor或List。实际上,我们最终按照下面的建议做了一些事情。非常感谢你的帮助!谢谢你的反馈。很高兴知道。你介意在你自己的回答中说明你做了什么吗?(可以自己回答关于堆栈溢出的问题)。我很想知道你是怎么做到的。
    message Author {
        int64 id = 1;
        string name = 2;
        repeated string books = 3;
        repeated string articles = 4;
    }