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

转载于:https://www.cnblogs.com/jnhs/p/11404572.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值