Hibernate中的1+N问题(带级联查询条件的情况)

1. Hibernate中的1+N问题描述   

        在多对一关系中,当我们需要查询多的一方对应的表的记录时,可以用一条sql语句就能完成操作。然而,在多的一方的实体类中的@ManyToOne标注的fetch的默认值是fetchType.EAGER,这时,hibernate除了发出查询多的一方对应的表的记录的sql语句外,还会发出n(多方记录数)条sql语句,这就是1+n问题。如:bbs的板块(Category),主题(topic),回复(msg)。一个板块有多个主题,而一个主题属于一个板块,则Category和topic属于一对多的关系,在topic里设置@ManyToOne。当需要取出所有的主题时,只需要发出select * from topic一条语句就能做到。然而,hibernate会查询出每个topic所对应的Category,所以会发出1+n条sql语句。

2. 1+N问题的解决办法

    ①设置@ManyToOne的fetch属性值为fetchType.LAZY,这种方式解决后,后面的n条sql语句按需而发。但是有个弊端,就是如果需要级联查询就无法获取级联对象了。

    ②设置@BatchSize(size=5)(该注解要加在类上面,跟@Entity在同一位置),这样发出的sql语句减少。这个设置在一定程度上提高了效率。

    ③在hqp语句中使用用join fetch,事实上Criteria用的就是这种方法。这也是最常用的方法;

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Test   
  2. //join fetch  
  3. publicvoid test1_N3(){  
  4.     Session session=sf.getCurrentSession();  
  5.     session.beginTransaction();  
  6.     //List<Topic> topics=(List<Topic>)session.createCriteria(Topic.class).list();//只有一条查询语句,Criteria方法就是这种方式  
  7.     List<Topic> topics=(List<Topic>)session.createQuery("from Topic t left join fetch t.category c").list();  
  8.     for (Topic t:topics) {  
  9.         System.out.println(t.getId()+"----"+t.getTitle());  
  10.         System.out.println(t.getCategory().getName());  
  11.     }  
  12.     session.getTransaction().commit();  
  13. }  

 3: 注:上面的就是最简单的1+n问题了

本人在项目中遇到过更加复杂的1+n问题。当带条件查询的时候:

如果我有查询条件呢?用left join fetch要报错

比如下面这个查询

from Topic t left join fetch t.category c where t.c.id='id' 会报错

from Topic t where t.c.id='id' 不会报错,但是有1+n问题。

目前我还没有找到办法解决这个问题,找到解决办法了,会更新文章的。

如果我有查询条件呢?用left join fetch要报错
比如下面这个查询
from Topic t left join fetch t.category c where t.c.id='id' 会报错
from Topic t where t.c.id='id' 不会报错,但是有1+n问题。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值