关于Hibernate中fatch=eager的bag集合(一个java List)使用Criteria查询出现重复记录的问题
来源:互联网 发布:mac修改u盘格式 编辑:程序博客网 时间:2024/05/16 08:57
关于这个问题在JPwH一书的13.2.3一节中做了详细的描述!
例子:ForumGroup和Forum
由于ForumGroup的forums被配制为eager fetch,也就是说在加载ForumGroup时,会同一并把它的所有Forum一起加载出来,这个过程是通过left out join来实现的。下面是hibernate打出的sql.
select
this_.id as id3_1_,
this_.creationTime as creation2_3_1_,
this_.description as descript3_3_1_,
this_.modifiedTime as modified4_3_1_,
this_.name as name3_1_,
forums2_.groupId as groupId3_,
forums2_.id as id3_,
forums2_.id as id2_0_,
forums2_.creationTime as creation2_2_0_,
forums2_.description as descript3_2_0_,
forums2_.groupId as groupId2_0_,
forums2_.modifiedTime as modified4_2_0_,
forums2_.name as name2_0_
from
ForumGroup this_
left outer join
Forum forums2_
on this_.id=forums2_.groupId
假定有1个ForumGroup,它有3个Forum,上面的sql会生成3条记录。那么Hibernate是如何封装这3条数据的呢?从实际的代码运行结果中可以看到:首先,Hibernate确实只生成了一个ForumGroup的实例和3个Forum的实例。但是如果你使用loadAllForumGroup时,会返回3个ForumGroup的引用,指向同一个ForumGroup的实例!
如果把ForumGroup的forums被配制为lazy fetch,会解决这个问题。但这也只是回避了这个问题!
正确的解决方法是什么呢?
如果想过滤join和fetch中的重复对象,有两种方法:
1.将续集里封装成set.比如:Set noDupes = new LinkedHashSet(resultList))
2.使用DISTINCT。比如:select distinct i from Item i join fetch i.bids
另外一个问题是:
在用JPA进行注释时,如果一个实体里要映射多个集合实体时,我们不能把两个集合的的FetchType设置为EAGER,此时只能设置为LAZY,否则会报:cannot simultaneously fetch multiple bags。或者我们也可以借助:@IndexColumn (加了它就不再是bag集合了,而是list集合了)。也就是说,hibernate不允许一次抓取多个bag.
- 关于Hibernate中fatch=eager的bag集合(一个java List)使用Criteria查询出现重复记录的问题
- hibernate 使用的集合类(list和bag)
- Hibernate 多表关联映射- Hibernate中使用的集合类型(set,list,array,bag,map)
- Hibernate中Criteria的使用(条件查询)
- 关于Hibernate的Criteria查询
- 关于Hibernate集合映射中 bag 的说明
- 关于Hibernate查询出现重复数据的问题和解决方案
- 关于hibernate中Criteria的使用
- 关于Hibernate中Criteria的使用
- 【Hibernate】Hibernate的集合映射(Set、List、Array、Map、Bag)
- Hibernate Criteria 查询 出现重复实体
- hibernate中Criteria的DISTINCT查询问题的解决方法
- Hibernate框架中Criteria的示例查询问题
- hibernate使用list映射,查询出来的list集合包含多个null记录
- Hibernate中Criteria的使用
- Hibernate的集合映射(Set、List、Array、Map、Bag)
- Hibernate的集合映射(Set、List、Array、Map、Bag)
- Hibernate常见的集合映射 Set,List,Array,Map,Bag
- 不想被淘汰,就别做这八种人!
- 懒蚂蚁精神
- load-on-startup
- fedora7安装bugzilla
- 从一个字符串中找出第一个不重复字符
- 关于Hibernate中fatch=eager的bag集合(一个java List)使用Criteria查询出现重复记录的问题
- 只有dba才能导入由其他dba导出的文件的解决方案
- PostMessage,SendMessage区别
- input runat server 控件 先通过onclick通过验证客户端验证,然后在执行服务端方法onserverclick 的
- 基于Visual Studio2010开发office2010办公自动化应用(9)自定义PowerPointAdd插件
- linux 下压缩、解压 打包命令
- SQL的分页查询
- 教你写个方便的调试函数
- 毕业设计服务器端完整程序