当前位置: 首页 > 知识库问答 >
问题:

MySql-一对多连接,将使用JDBI的连接映射到列表

谷弘致
2023-03-14

我试图用JDBI编写一个对象查询,它将从左表中抓取一个完整的行,并将右表中所有匹配的行作为List(一个作者可以有很多本书)连接起来。

作者id、姓名、创建日期、更新日期、电子邮件、电话号码

图书编号、标题、作者、类别、创建日期、更新日期

我要创建的最终对象的结构如下所示:

class AuthorWithBooks() {
  int id,
  String name,
  List<String> categories,
  long createdAt,
  long updatedAt,
  String email,
  String phoneNumber
  List<Book> books
}

书在哪里:

class Book {
  id,
  title,
  authorId,
  categories,
  createdAt,
  updatedAt
}

这是我正在尝试的查询(不按原样抓取图书列表)

@SqlQuery("SELECT " + AUTHOR_COLUMN MAMES + ", " + BOOK_COLUMN_NAMES + " FROM authors as author" +
      " LEFT JOIN books AS book" +
      " ON author.id = book.authorId" +
      " WHERE id = :authorId")
  List<AuthorWithBooks> getAuthorWithBooks(@Bind("authorId") int authorId);

如果有人能为我指出正确的方向,我将不胜感激!

谢谢

共有1个答案

裴浩歌
2023-03-14

看起来你需要@UseRowReducer

您的示例的实现如下所示:

@SqlQuery("SELECT a." + AUTHOR_COLUMN MAMES + ", b." + BOOK_COLUMN_NAMES + " FROM authors as author" +
  " LEFT JOIN books AS book" +
  " ON author.id = book.authorId" +
  " WHERE id = :authorId")
@RegisterBeanMapper(value = Book.class, prefix = "b") 
@RegisterBeanMapper(value = AuthorWithBooks.class, prefix = "a")
@UseRowReducer(AuthorBookReducer.class) 
List<AuthorWithBooks> getAuthorWithBooks(@Bind("authorId") int authorId);

class AuthorBookReducer implements LinkedHashMapRowReducer<Integer, Author> { 
    @Override
    public void accumulate(Map<Integer, Author> map, RowView rowView) {
        Author author = map.computeIfAbsent(rowView.getColumn("a_id", Integer.class), 
                                       id -> rowView.getRow(Author.class));

        if (rowView.getColumn("b_id", Integer.class) != null) { 
            author.getBooks().add(rowView.getRow(Book.class));
        }
    }
}
 类似资料:
  • 我开始使用JOOQ和dvd租赁商店数据库aka sakila。基本上,我想找一个演员和他的角色(我创建的表)。到目前为止,我想到了这个: 我希望能够将演员及其角色提取到一个对象中:DTO。我找到了这篇文章https://arnaudroger.github.io/blog/2017/03/02/jooq-one-to-many-without-dto.html但我发现使用sfm的解决方案过于冗长,

  • 问题内容: 假设我在MySQL数据库中有两个表。 表格1: 表2: 从数据库中选择行时,是否有任何方法可以将第二个表中的行作为列连接到第一个表中?目前我正在使用。 输出: 目前,我正在PHP脚本中对此进行排序,以将其排序为一个数组。这很痛苦,因为我必须查看ID,看看它们是否相同,然后进行相应的排序。我觉得有一种方法可以在MySQL中正确执行此操作,而不必在PHP中将其分类为数组。每个ID在第二个表

  • 我正在尝试用JDBI编写一个对象查询来处理一对多关系。正如在文档中所看到的,就是这样做的方法。但是我把这些错误归咎于构造函数; 更新:为每个实体保留一个构造函数。

  • 问题是我不想把我的密码放在yaml文件中。我想使用密钥文件或不记名令牌。我不确定我怎么能从这个开始。请帮帮忙。提前致谢:)

  • 我使用了以下命令进行端口映射 其中3306端口属于本地主机MySQL,33060是进入docker容器的端口,因此docker中的3306:33060之间正在进行通信。我的问题如下: docker:守护进程的错误响应:驱动程序未能在endpointApp1上编程外部连接(30EC933973ACF63A48EF9A20B0027AF18BD23E1F36CF852E3758EAA1F843):启动

  • 我们所面临的问题已在许多文件中得到充分证明https://stackoverflow.com/questions/34189756/warning-about-ssl-connection-when-connecting-to-mysql-database. 从过渡到时,我们就开始面临这个问题。建议的修复方法对我们有效,但我们有一个问题,我们不想更新Java源文件以进行更改,例如从 到 正如在ht