先来看数据表
版块表只有两个数据
板块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
时间: 2024-11-09 07:06:29