7.hibernate查询优化

  1. hibernate可以为业务属性配置的查询为  join select 为集合属性配置的查询 join select subselect

   <class name="Department" table="tb_Department">

       <id name="id" column="id">

           <generator class="increment" />

       </id>

       <property name="departName" column="depName" />

       <property name="createDate" column="createDate" />

       <set name="emplayees" fetch="join">

           <key column="departId" />

           <one-to-many class="Emplayee" />

       </set>

    </class>

select 为默认的。当为默认时懒加载为true时会在使用业务属性时发送查询的语句。

当为false时会在初始化时发送查询语句,也即为立即加载。两种语句的形式一样。

 

Join 时对懒加载lazy的设置将没有什么意义,因为这时查询会通过join子句查出相关联的对象。

 

Select 与join 在业务属性与集合属性要效果一样。

Subselect

会查询前一次查询出的对角的所有的关联属性

 

  1. hibernate的加载方式

l         预先加载

通过fetch子句来实现,对应的sql代码为join。若没有fetch则join并没有什么意义。

Eg:

l         立即加载

Hibernate会为每个业务属性发送一条语句,这个语句在查询时就发出,即配置lazy=”false”来实现

l         延迟加载

通过lazy=”true” 来实现

       //用join来查询没有必要写上on条件,因配置文件已经写明了两个表连接的条件。但是后面可以写上where过滤条件,以过滤想要的数据。这与sql一样

       //而事实上下面hql1与hql2两句话的效果是一样的.当lazy="true"时会进行懒加载,只有用到业务属性时才加载相应的业务属性。当lazy="false"时会为每个业务

       //属性发送一条sql语句,当然前提是一级缓存里面没有。这个时候join没有什么意思,有业务属性来直接查询要简单。

       //当用fetch语句时则lazy的设置将对这个查询没有影响,都会通一条sql语句查出所有的数据,初始化各业务属性,这在使用dwr时很有用。

       String hql1="select dep from Department dep where dep.emplayees.empName='rose'";

       String hql2="select dep from Department dep join  dep.emplayees emp where emp.empName='rose'";

//使用这种查询时一定要注意别名的命名方法,尽量不要再和实体类的名字相同,大小写不同也不行,尽量用简写,否则容易报错

       String hql3="select dep from Department dep join fetch dep.emplayees emp";

l         另一种很有用的加载方式。

Fetch all properties 用来强制hibernate立即取得那些原本需要延迟加载的属性:

Eg:from Order order fetch all properties order by order.id.

    From Order order fetch all properties where order.orderItems.product.name like ‘%宝马%’

posted @ 2010-05-03 17:23  沉兮  阅读(742)  评论(0编辑  收藏  举报