Spring Data JPA Repository返回Set为何可正常工作?
关于Spring Data JPA Repository返回Set的疑问
先贴出定义的Repository代码:
public interface GroupRepository extends JpaRepository<Group, Integer> { Set<Group> findAllByStudentsStudentId(Long studentId); }
按照Baeldung文章和Spring官方文档里的《支持查询返回类型》说明,Set本不应开箱即用,但实际运行正常,有两个疑问:
- 为何该情况未被提及(或我是否理解有误)?
- 若Spring进行类型转换,是先构建List/Iterable再转为Set,还是从一开始就用Set合并实体?
问题1解答
这大概率是文档更新滞后或者你查阅的是较旧版本的文档导致的。Spring Data JPA在后续版本演进中,悄悄扩展了对返回类型的支持范围——只要是Iterable的子类型、且有公开无参构造器的集合实现类(比如HashSet),框架都能自动完成适配转换。早期文档可能只明确列出了List、Iterable、Page这些常用类型,但实际内部逻辑已经覆盖了更多集合类型,只是文档没及时同步更新。
问题2解答
Spring Data JPA是先构建List/Iterable再转为Set的。因为JPA底层查询引擎返回的结果本质是有序的集合(比如List或者ScrollableResults),框架会先获取这部分结果,再根据你声明的返回类型(这里是Set),创建对应的集合实例(默认用HashSet),把查询结果中的元素逐个添加进去。整个过程不会在查询阶段就用Set来合并实体,因为JPA本身没有针对Set的查询逻辑,所有结果集的处理都是先以有序集合拿到数据,再做类型转换。
内容的提问来源于stack exchange,提问作者Slevin
相关产品推荐
相关产品推荐

