【问题标题】:MySql - One to Many Join, mapping JOIN with JDBI to ListMySql - 一对多连接,将 JOIN 与 JDBI 映射到列表
【发布时间】:2019-01-15 16:11:19
【问题描述】:

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

作者 id, name, createdAt, updatedAt, email, phoneNumber

id, title, authorId, categories, createdAt, updatedAt

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

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

将不胜感激任何帮助/有人指出我正确的方向!

谢谢!

【问题讨论】:

    标签: java mysql jdbi


    【解决方案1】:

    看来你需要@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));
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2014-04-02
      • 2013-06-04
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多