二十二、 1+N 问题

问题的来源:

在@ManyToOne中,由于默认的fetch=FetchType.EAGER,所以如下的代码

List<Topic> topics = session.createQuery("from Topic").list();

本来只发一条sql就能查询出所以的Topic对象,结果Topic所关联的Catagory对象也会马上查询出来,而且如果有N个Topic对象,就会再发N条sql去查询Catagory对象。

 

解决办法:

1、@ManyToOne(fetch=FetchType.LAZY)
    //fetch=FetchType.LAZY 解决N+1问题 说明如下:
    //当多对一(@ManyToOne)已经设定属性" fetch=FetchType.LAZY "时
    //只有当需要时(如:t.getCategory().getName()时)才会去获取关联表中数据 可以解决N+1问题
2、@BatchSize
    //@BatchSize 解决N+1问题 说明如下:
    //在与查询表(此例中为Topic类)关联的表类(此例中为Category类)头处加@BatchSize(size=5)
    //表示每次可查出5条记录 从而减少了select语句的个数
3、join fetch(使用join fetch后返回的是一种对象(List<Topic>),而不是像只使用join 返回多种对象List<Ojbect[]>)
    //join fetch 解决N+1问题 说明如下:
    //修改hql语句为--"  from Topic t left join fetch t.category c  "
4、QBC
    //QBC(Query By Criteria) 解决N+1问题 说明如下:
    //使用QBC的 createCriteria(*.class)执行查询 也可避免N+1问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值