【问题标题】:JOOQ - fetch foreign objects like in JPAJOOQ - 像在 JPA 中一样获取异物
【发布时间】:2015-12-12 02:48:39
【问题描述】:

我的数据库中有两个表:

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);
    }

不幸的是,它需要对数据库进行多次查询。一个选择来获取作者,另外一个查询来获取每个作者的书籍。我试图加入表格,但我不知道如何使用 jooq 正确解析结果。有什么想法吗?

【问题讨论】:

标签: java java-8 jooq


【解决方案1】:

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

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());

【讨论】:

  • 此解决方案将比一个选择 sql 选项优雅得多,因为在加入后没有简单的方法来映射您的结果。您可能必须自己映射结果。在我看来,选择这个。
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 2017-11-06
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多