Java JOOQ-获取JPA中的外来对象

Java JOOQ-获取JPA中的外来对象,java,java-8,jooq,Java,Java 8,Jooq,我的数据库中有两个表: CREATE TABLE `AUTHOR` ( `ID` varchar(255) NOT NULL, `NAME` varchar(255) NOT NULL, PRIMARY KEY (`ID`) ) CREATE TABLE `BOOK` ( `ID` varchar(255) NOT NULL, `TITLE` varchar(255) NOT NULL, `AUTHOR_ID` varchar(255) NOT NULL, PRIM

我的数据库中有两个表:

CREATE TABLE `AUTHOR` (
  `ID` varchar(255) NOT NULL,
  `NAME` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
)

CREATE TABLE `BOOK` (
  `ID` varchar(255) NOT NULL,
  `TITLE` varchar(255) NOT NULL,
  `AUTHOR_ID` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`),
  FOREIGN KEY (`AUTHOR_ID`) REFERENCES `AUTHOR` (`ID`)
)
正如你所看到的,作者和书之间有一种关系:作者可以有很多书。在我的应用程序中,我希望获取所有作者,每个作者都有他们的书籍集。现在我用代码实现了这一点:

public List<Author> findAll() {
        List<Author> authors = dsl.selectFrom(AUTHOR)
                .fetchInto(Author.class);

        return authors.stream()
                .map(author -> new Author(author.getId(), author.getName(), getBooksForAuthor(author.getId())))
                .collect(Collectors.toList());
    }

    private List<Book> getBooksForAuthor(String authorId) {
        return dsl.select(BOOK.ID, BOOK.TITLE)
                .from(BOOK)
                .where(BOOK.AUTHOR_ID.eq(authorId))
                .fetchInto(Book.class);
    }
公共列表findAll(){
列表作者=dsl。选择作者(作者)
.fetchInto(Author.class);
返回authors.stream()
.map(author->new author(author.getId()、author.getName()、getBooksForAuthor(author.getId()))
.collect(Collectors.toList());
}
私有列表GetBookForAuthor(字符串authorId){
返回dsl.select(BOOK.ID,BOOK.TITLE)
.从(书)
.where(图书作者身份证eq(作者))
.fetchin(Book.class);
}

不幸的是,它需要对数据库进行许多查询。一个select用于获取作者,另外一个query用于为每个作者获取书籍。我试图连接表,但我不知道如何使用jooq正确解析结果。有什么想法吗?

从效率的角度来看,我可能会分两步来做:

List<Author> authors = dsl.selectFrom(AUTHOR)
                          .fetchInto(Author.class);

Map<String, List<Book>> booksByAuthorId = dsl.selectFrom(BOOK)
                                             .fetchMap(BOOK.AUTHOR_ID, Book.class);

return authors.stream()
    .map(author -> new Author(author.getId(),
                              author.getName(),
                              booksByAuthorId.getOrDefault(author.getId(), emptyList())))
    .collect(Collectors.toList());
List authors=dsl.selectFrom(AUTHOR)
.fetchInto(Author.class);
Map booksByAuthorId=dsl。选择从(书本)
.fetchMap(BOOK.AUTHOR\u ID,BOOK.class);
返回authors.stream()
.map(author->new author(author.getId(),
author.getName(),
booksByAuthorId.getOrDefault(author.getId(),emptyList())
.collect(Collectors.toList());

此解决方案将比一个select sql选项优雅得多,因为在加入后映射结果并不容易。您可能需要自己绘制结果。在我看来,请使用此选项。有关使用
join
的方法,请参见此选项: