hibernate一对多关系 在一方查询会获得重复数据,重复数量就是多端数据数量用@Fetch(FetchMode.SUBSELECT)解决
先来看数据表
版块表只有两个数据
板块1是推荐,下边没有子栏目
板块2下边有14个子栏目
在1的一端来查询,发现结果有16条
也就是板块1+版块2+版块2和他的14个子集都列出来了,这明显不对
板块对象的配置
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) @JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联
猜测了一下,是急加载导致的
查需语句为
Hibernate: select this_.id as id1_17_1_, 。。。。from t_section this_ left outer join t_column columnmode2_ on this_.id=columnmode2_.sectionId Hibernate: select columnmode0_.id as id1_7_, 。。。。from t_column columnmode0_ where columnmode0_.sectionid='1'
删除这个策略配置为
@OneToMany(cascade = {CascadeType.ALL}) @JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联
或者使用懒加载
@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY) @JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联
可以解决这个数据集重复的问题
但是,这样又获取不到多方的集合
看起来问题并不能这样解决
经过查询得知,使用 @Fetch可以解决这个问题
@OneToMany(cascade = {CascadeType.ALL}) @JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联 @Fetch(FetchMode.SUBSELECT)
在控制台得知,发出的是两条查询
Hibernate: select this_.id as id1_17_0_, 。。。。。from t_section this_ Hibernate: select columnmode0_.id as id1_7_, 。。。。from t_column columnmode0_ where columnmode0_.sectionid='1'
如果注解再改一下
@OneToMany(cascade = {CascadeType.ALL},fetch = FetchType.EAGER) @JoinColumn(name = "sectionId")//ColumnMoDel中的外键,用于关联 @Fetch(FetchMode.SUBSELECT)
语句又变了
Hibernate: select this_.id as id1_17_0_, 。。。。from t_section this_ Hibernate: select columnmode0_.sectionId as sectionI7_17_1_, 。。。。from t_column columnmode0_ where columnmode0_.sectionId in ( select this_.id from t_section this_ )
至于查询效率问题,目前暂无时间处理,有时间再用分析器测试,不过从语句上来分析,@Fetch(FetchMode.SUBSELECT)配合急加载肯定不如搭配懒加载快
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!