JOOQ - 像在 JPA 中一样获取外来对象
JOOQ - fetch foreign objects like in JPA
我的数据库中有两个表:
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);
}
不幸的是,它需要对数据库进行多次查询。一个 select 用于获取作者,另外一个查询用于获取每位作者的书籍。我试图连接表,但我不知道如何使用 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());
我的数据库中有两个表:
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);
}
不幸的是,它需要对数据库进行多次查询。一个 select 用于获取作者,另外一个查询用于获取每位作者的书籍。我试图连接表,但我不知道如何使用 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());