码迷,mamicode.com
首页 > Web开发 > 详细

hibernate一对多关系 在一方查询会获得重复数据,重复数量就是多端数据数量用@Fetch(FetchMode.SUBSELECT)解决

时间:2019-08-24 14:57:02      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:使用   http   就是   删除   sele   时间   model   mamicode   man   

先来看数据表

版块表只有两个数据

技术图片

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

hibernate一对多关系 在一方查询会获得重复数据,重复数量就是多端数据数量用@Fetch(FetchMode.SUBSELECT)解决

标签:使用   http   就是   删除   sele   时间   model   mamicode   man   

原文地址:https://www.cnblogs.com/jnhs/p/11404572.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!