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
的方法,请参见此选项: