Spring Data JDBC查询关联表未用JOIN,而是多次执行SELECT的问题
关于@MappedCollection导致N+1查询的原因
- Spring Data JDBC中,
@MappedCollection注解关联的子实体集合(比如你的TestB集合),默认采用延迟加载+N+1查询的策略,这是框架的设计决定。它会先查询所有聚合根(TestA)数据,当访问到子实体集合时,再为每条聚合根单独发起子实体查询——如果调用findAll()后直接触发了所有子查询,大概率是后续操作(比如序列化返回、代码中访问集合)触发了集合的加载。 @MappedCollection的设计核心是维护聚合根的数据完整性,而非默认优化查询性能。框架刻意避免自动生成JOIN查询,因为JOIN会导致聚合根数据重复出现在每条子实体记录中,不符合聚合根作为单一数据边界的设计原则。- 和JPA的
@OneToMany不同,Spring Data JDBC默认没有批量抓取的优化逻辑,也没有类似JPA的一级缓存来减少重复查询,所以默认行为就是逐条查询子实体。
内容的提问来源于stack exchange,提问作者bcassand
相关产品推荐
相关产品推荐

