优化报表查询的性能

来源:互联网 发布:linux less 查找 编辑:程序博客网 时间:2024/05/18 17:02

当select语句仅仅选择查询持久化类的部分属性时,Hibernate返回的查询结果为关系数据,而非持久化对象。例如:

from Customer c inner join c.orders o group by c.age

select c.id,c.name,c.age,o.id,o.order_number,o.customer_id from Customer c inner join c.orders o group by c.age

以上两条HQL 查询语句对应的SQL语句相同,因此能查询出数据库中相同的数据,区别在于前者返回的是Customer和

Order持久化对象,他们位于Session的缓存中,Session会保证他们的唯一性。后者返回的是关系数据,他们不会占用Session的缓存,

只要应用程序中没有任何变量应用这些数据,他们占用的内存就可以被JVM的垃圾回收器回收。

 

因此,采用第二种能提高查询性能,只要应用程序不再引用这些数据,他们占用的内存就会被释放。

 

对于第二中形式,可以定义一个JavaBean累包装查询结果中的关系数据,使应用程序仍能按照面向对象的方式来访问查询结果,例如:

 

select from new CustomerOrder(c.id,c.name,c.age,o.id,o.order_number,o.customer_id)

from Customer c inner join c.orders o group by c.age

 

CustomerOrder类不是持久化类,他的实例不会被加入到Session的缓存中。

原创粉丝点击