码迷,mamicode.com
首页 > 其他好文 > 详细

hibernte中hql问题 hql语句里 select xx from。。。与 from。。。有何区别?

时间:2017-12-26 18:03:55      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:性能   垃圾回收器   span   数据库数据   查询方式   持久化   检索   sel   sele   

select xx from。。。查出来的是XX字段。from XX查出来是对象
from Customer c inner join c.orders o group by c.age;(1) 
select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID 
from Customer c inner join c.orders c group by c.age;(2) 
这两条语句使用了HQL语句的内连接查询(我们将在HQL语句的连接查询部分专门讨论),现在我们可以看出这两条查询语句最后所返回的结果是一样的,但是它们其实是有明显区别的,语句(1)检索的结果会返回 Customer与Order持久化对象,而且它们会被置于Hibernate的Session缓存之中,并且Session会负责它们在缓存中的唯一性以及与后台数据库数据的同步,只有事务提交后它们才会从缓存中被清除;而语句(2)返回的是关系数据而并非是持久化对象,因此它们不会占用 Hibernate的Session缓存,只要在检索之后应用程序不在访问它们,它们所占用的内存就有可能被JVM的垃圾回收器回收,而且 Hibernate不会同步对它们的修改。 
    在我们的系统开发中,尤其是Mis系统,不可避免的要进行统计查询的开发,这类功能有两个特点:第一数据量大;第二一般情况下都是只读操作而不会涉及到对统计数据进行修改,那么如果采用第一种查询方式,必然会导致大量持久化对象位于Hibernate的Session缓存中,而且 Hibernate的Session缓存还要负责它们与数据库数据的同步。而如果采用第二种查询方式,显然就会提高查询性能,因为不需要 Hibernate的Session缓存的管理开销,而且只要应用程序不在使用这些数据,它们所占用的内存空间就会被回收释放。 
    因此在开发统计查询系统时,尽量使用通过select语句写出需要查询的属性的方式来返回关系数据,而避免使用第一种查询方式返回持久化对象(这种方式是在有修改需求时使用比较适合),这样可以提高运行效率并且减少内存消耗。㊣真正的高手并不是精通一切,而是精通在合适的场合使用合适的手段。 
    数据库量大时不用用“in”,否则速度超慢,而应该用left join之类的替换

 

hibernte中hql问题 hql语句里 select xx from。。。与 from。。。有何区别?

标签:性能   垃圾回收器   span   数据库数据   查询方式   持久化   检索   sel   sele   

原文地址:https://www.cnblogs.com/lcycn/p/8118555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!