推荐的方法来解决Spring Data的多对多关系的常见要求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐的方法来解决Spring Data的多对多关系的常见要求相关的知识,希望对你有一定的参考价值。

这个问题的目的是分享我们如何使用Spring Data解决(我认为常见的)需求的经验。

鉴于以下多对多关系:

@Entity
public class Book {
    @GeneratedValue
    @Id
    private int id;

    @OneToMany(mappedBy = "book", fetch = FetchType.LAZY)
    private List<BookCategory> categories;

    // rest omitted for clarity
}

@Entity
public class Category {
    @GeneratedValue
    @Id
    private int id;

    // rest omitted for clarity
}

@Entity
public class BookCategory {
    @GeneratedValue
    @Id
    private int id;

    @ManyToOne(fetch = FetchType.EAGER)
    private Book book;

    @ManyToOne(fetch = FetchType.EAGER)
    private Category category;

    int ordering = 0;

    // rest omitted for clarity
}

搜索要求:

  • 得到所有的书
  • 通过BookCategory.ordering获取A类和B类(要搜索的类别数是动态的)订单
  • 通过Book.name获取B类订单的书籍

在应用程序中使用本书时,需要始终显示指定的类别。

我的问题是

  • 哪种查询构建机制最能满足要求? (@Query,通过示例查询,直接使用EntityManager,...)
  • 搜索查询如何?
  • 使用本书时如何避免n + 1问题?
答案

哪种查询构建机制最能满足要求?

使用Spring Data的规范或使用QueryDSL库

搜索查询如何?

SELECT b.* from Book where exists (select 1 from bookCategory bc where bc.book_id=b.id and bc.category_id in (:catList) group by bc.book_id having count(bc.book_id) = (:catListSize));

使用本书时如何避免n + 1问题?

使用急切的书籍 - > BookCategory

以上是关于推荐的方法来解决Spring Data的多对多关系的常见要求的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中两个实体之间的多对多关系

如何有效地迭代 NSSet (Objective-C) - Core Data 中的多对多关系表示?

使用 Spring Boot、Jackson 和 Hibernate 的多对多关系

对于我的多对多关系,Core Data 获取速度非常慢?

如何处理mongodb中的多对多关系

使用 Swift 和 Core Data 的多对多附加数据