hibernate一对多关系 在一方查询会获得重复数据,重复数量就是多端数据数量用@Fetch(FetchMode.SUBSELECT)解决
Posted jnhs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)配合急加载肯定不如搭配懒加载快
以上是关于hibernate一对多关系 在一方查询会获得重复数据,重复数量就是多端数据数量用@Fetch(FetchMode.SUBSELECT)解决的主要内容,如果未能解决你的问题,请参考以下文章