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

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之类的替换

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

时间: 2024-08-29 21:14:06

hibernte中hql问题 hql语句里 select xx from。。。与 from。。。有何区别?的相关文章

Spring中常用的hql查询方法(getHibernateTemplate()) 【转】

一.find(String queryString); 示例:this.getHibernateTemplate().find("from bean.User"); 返回所有User对象 二.find(String queryString , Object value); 示例:this.getHibernateTemplate().find("from bean.User u where u.name=?", "test"); 或模糊查询:th

项目中遇到的HQL查询问题

问题描写叙述: 目的:想要查询出全部最新版本号的组件 说明:组件:版本号 =1:n关系 ,假设这个组件仅仅有一个版本号也要可以查出来. 项目中使用的是内存数据库,无法看到表结构,这里的样例仅仅用于模拟. 也即是: 最初的数据是这种. 想要的结果是这种. 最初的设想是这种. select component from Component component where component.owner=:userId andcomponent.componentId.version.versionS

mysql.select语句里怎样批量的在一个字段前面加指定字符

mysql.select语句里怎样批量的在一个字段前面加指定字符?也就是update语句怎样写才能实现? 假设现在需要更新的字段是name,对应的值是value,现在要将字符"B"批量的加到原来值之前,变成Bvalue,请问update语句怎么写? update tablename set name=concat("B",name); mysql.select语句里怎样批量的在一个字段前面加指定字符

HQL查询——HQL查询的基本用法

HQL查询--HQL查询的基本用法 1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言.SQL语言操作的对象是数据表.列等数据库对象,而HQL语言的操作对象是类.实例.属性等. 2.由于HQL语言是面向对象的查询语言,所以他具有面向对象的特征,即支持继承和多态. 3.HQL查询依赖于Hibernate提供的Query类,每个Query类实例对应一个查询对象. 4.使用HQL查询的步骤如下: (1)获取Hibernate Session对象: (2)编写HQL语句

SQL Server中常用的SQL语句

1.概述 2.查询概述 3.单表查询 4.连接查询 5.带有exists的相关子查询 6.SQL的集合操作 7.插入操作 8.删除操作 9.修改操作 10.数据定义 11.视图 1.概述 名词 笛卡尔积.主键.外键 数据完整性 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空 参照完整性:表中的外键取值为空或参照表中的主键 用户定义完整性:取值范围或非空限制,例如:性别(男女),年龄(0-130) 表连接 自然连接:与等值连接(a.id=b.id)相比,连接后的表只有一列id,而不

mysqli_stmt类:使用预处理语句处理SELECT查询结果

SELECT语句和其他的SQL查询命令不同,它需要处理查询结果.SQL语句的执行也需要使用mysqli_stmt对象中的execute()方法,但与mysqli对象中的query()方法不同,execute()方法的返回值并不是一个mysqli_result对象.mysqli_stmt对象提供了一种更为精巧的办法来处理SELECT语句查询结果:在使用execute()方法执行SQL语句完成查询之后,使用mysqli_stmt对象中的bind_result()方法,把查询结果的各个数据列绑定到一些

SQL Server中常用的SQL语句(转):

SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主键.外键 数据完整性 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空 参照完整性:表中的外键取值为空或参照表中的主键 用户定义完整性:取值范围或非空限制,例如:性别(男女),年龄(0-130) 表连接 自然连接:与等值连接(a.id=b.id)相比,连接后的表只有一列id,而不是两列

在程序开发中怎样写SQL语句可以提高数据库的性能

以下内容是公司dba总结. 1. 首先要搞明白什么叫执行计划?   执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择"索引查找"方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用"全表扫描"方式. 可见,执行计划并不是固定的,它是"个性化的".产生一个正确的"执行计划

机房收费系统中遇到的SQL语句问题

个人版机房收费系统正在进行中,遇到了几个有关SQL语句的问题. 1.sum函数的使用: 在结账部分,要求出某个表中某一列的和.在第一次机房系统中,我不知道sum函数的存在,很傻很天真地用循环一个一个往上加.下面以求所有卡中余额的和来说说sum函数怎么使,SQL语句为:select sum(cash)from T_Card.这个格式不是固定的,可以根据需求更改,比如求多列的和:select sum(列名1),sum(列名2)...from [表名] where....查询出来的结果只有一行,如果只