推荐的方法来解决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的多对多关系的常见要求的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地迭代 NSSet (Objective-C) - Core Data 中的多对多关系表示?