一、 定义:
首先发出一条语句查询当前对象,然后发出N条语句查询关联对象,N不确定,效率比较低。
两张表的数据
在查询category表的时候,查询相应的管理员
hibernate 会发送三条数据,
一条用于查询category表中的数据,
根据id,另两条用于查询级联的账户表,查到的将不再查询。
Hibernate: select category0_.id asid0_, category0_.type as type0_, category0_.hot as hot0_, category0_.aid asaid0_ from shop.category category0_ where category0_.type like ?
用于查询账户1和账户2:
Hibernate: select account0_.id asid1_0_, account0_.login as login1_0_, account0_.name as name1_0_,account0_.pass as pass1_0_ from shop.account account0_ where account0_.id=?
Hibernate: select account0_.id asid1_0_, account0_.login as login1_0_, account0_.name as name1_0_,account0_.pass as pass1_0_ from shop.account account0_ where account0_.id=?
如果 有A-->B-->C的关联关系,会发很多的sql语句
二、 hibernate解决方案:
<!-- lazy=false级联查询关联对象
N+1:首先发出一条语句查询当前对象,然后发出语句查询关联对象,N不确定,因此效率相对较低
fetch:什么样的方式加载关联对象,可以选择select(默认)和join多表查询
注意:在many-to-one:的情况下:join是无效的
-->
<many-to-onename="account"class="Account"lazy="false" fetch="join">
<columnname="aid"/>
</many-to-one>
三、 我们的解决方案:
自己写HQL语句取代基于XML的配置,则可以提升性能,
xml中只需要如下配置,不需要懒加载 lazy="false"fetch="join",否则性能上不来
<many-to-onename="account"class="Account">
<columnname="aid"/>
</many-to-one>
sql语句如下:注意这里不需要On,有On语法是错误的,对应的id关系已经在xml中配置了
木有fetch,查询的是object【】数组
List<Category> list=getSession().createQuery("FROM Category c LEFT JOIN c.account WHERE c.type like :type")
.setString("type","%" + type + "%")
.list();
有fetch将把aount对象中的属性抓取出来放入category对象的account属性中
List<Category> list=getSession().createQuery("FROM Category c LEFT JOIN fetch c.account WHEREc.type like :type")
.setString("type","%" + type + "%")
.list();