7.hibernate查询优化
- 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
会查询前一次查询出的对角的所有的关联属性
- 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 ‘%宝马%’