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)配合急加载肯定不如搭配懒加载快

posted @   不打鱼光晒网  阅读(1586)  评论(1编辑  收藏  举报
编辑推荐:
· 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 重磅开源!
点击右上角即可分享
微信分享提示