HQL查询

标签: hql | 发表时间:2012-12-09 16:42 | 作者:aigoChina
出处:http://blog.csdn.net
一、HQL语言
HQL语句与SQL语句相似,其基本的使用习惯也与SQL相同。由于HQL是面向对象的查询语句,所以它需要从目标对象中查询信息并返回匹配单个实体对象或多个实体对象的集合,而SQL语句是从数据库的表中查找指定信息,返回的是单条信息或多个信息的集合。
HQL语句区分大小写的
HQL的基本语法:
select "对象.属性名"
from "对象"
where "过滤条件"
group by "对象.属性名" having "分组条件"
order by "对象名.属性名"
实际应用中,
select * from People p where p.id='1'
等价于
from People p where p.id='1'
该HQL语句是查询过滤从数据库信息返回的实体对象的集合,其过滤的条件为对象属性"id"为1,其中People为实体对象
二、实体对象查询
在HQL语句中,可以通过from子句对实体对象进行直接查询:
from People
在大多数情况下,最好为查询的实体对象指定一个别名,以方便在查询语句的其它地方引用实体对象,别名的命名方法如下:
from People p
别名的首字母最好小写,这是HQL语句的规范写法,与Java中变量的命名规范是一致的,以避免与语句中的实体对象混淆。
上面的HQL语句将查询数据库的实体对象People所对应的所有数据,并以封装好的People对象的集合的形式返回。但是上面的语句有个局限性,它会查询实体对象People映射的所有数据库字段,相当于SQL语句的"SELECT *"。那么,HQL如何获取指定的字段信息?在HQL中需要通过动态实例化查询来实现这个功能,示例如下:
select new People(id,name) from People p

此种查询方式通过"new"关键字对实体对象动态实例化,将指定的实体对象属性进行重新封装,既不失去数据的封装性,又可以提高查询的效率。
在上面的语句中,最好不要使用下面的语句进行查询:

select p.id,p.name from People p

因为此语句返回的不是原有的对象实体状态,而是一个object类型的数据,它破坏了数据原有的封装性。
三、条件对象查询
例如:

from People p where p.sex="男"

四、HQL参数绑定机制:
参数绑定机制可以使查询语句和参数具体值相互独立,不但能提高程序的开发效率,还可以有效的防止SQL的注入攻击。
1.利用顺序占位符"?"替代具体参数在HQL语句中可以通过顺序占位符"?"替代具体的参数值,利用Query对象的setParameter()方法对其进行赋值,此种操作方式与JDBC中的PreparedStatement对象的参数绑定方式相似。
例如:

Session session=HibernateInitialize.getsession();
List peopleList=new ArrayList();
String hql="from People p where p.sex=?";
Query query=session.createQuery(hql);
query.setParameter(0,"男");
peopleList=query.list();

2.利用引用占位符":parameter"替代具体的参数
HQL语句除了支持顺序占位符"?"以为,还支持引用占位符":parameter",引用占位符是":"号与自定义参数名的组合。
例如:

Session session=HibernateInitialize.getsession();
List peopleList=new ArrayList();
String hql="from People p where p.sex=:sex";
Query query=session.createQuery(hql);
query.setParameter("sex","男");
peopleList=query.list();

五、排序查询
在SQL中,通过order by 子句和asc、desc关键字实现查询结果集的排序操作,asc是正序排列,desc是降序排列。HQL查询中同样提供了此功能,只是排序的条件参数换成了实体对象的属性
按年龄的倒序排列:

from People p order by p.age desc

按照id的正序排列:

from People p order by p.id asc

六、聚合函数
HQL查询语句支持SQL中常用的聚合函数,如sum 、avg、count、max、min等,其使用方法与SQL中基本相同。
如:

select avg(p.age) from People p 

用于计算所有人的平均年龄
又如:

select max(p.age) from People p

用于查询所有人中的年龄最大的这个人的信息
七、分组查询
在HQL查询语言中,使用group by子句进行分组操作,其使用与SQL语句相同。在HQL中,同样可以使用group by子句使用having子句,不过这需要底层数据库的支持。
如:

select p.sex,count(*) from People p group by p.sex

注意,HQL分组查询语句中的分组条件,也就是group by子句后的参数必须包含在查询的结果中。
由于分组查询破坏了实体对象的原来的状态,所以结果集返回的是对象数组。
八、子查询
HQL支持子查询,不过需要底层数据库的支持。HQL中的一个子查询必须被圆括号()包起来

from People p where p.age>(select avg(age) from People)

九、联合查询
HQL支持SQL中的内连接(inner join)、左外连接查询(left outer join)、右外连接查询(right outer join)和全连接查询(full join)
如,在班级表和学生表中一对一映射关系,可以通过HQL的左连接方式获取关联信息
如:

select s.number,s.name,s.age,s.sex,c.id from Student s left join Class c
作者:aigoChina 发表于2012-12-9 16:42:42 原文链接
阅读:0 评论:0 查看评论

相关 [hql] 推荐:

HQL查询

- - CSDN博客推荐文章
HQL语句与SQL语句相似,其基本的使用习惯也与SQL相同. 由于HQL是面向对象的查询语句,所以它需要从目标对象中查询信息并返回匹配单个实体对象或多个实体对象的集合,而SQL语句是从数据库的表中查找指定信息,返回的是单条信息或多个信息的集合. select "对象.属性名" from "对象" where "过滤条件" group by "对象.属性名" having "分组条件" order by "对象名.属性名".

动态加载HQL

- senyo - BlogJava-首页技术区
Java代码如下:(ReloadableDynamicHibernate.java). 135         private Map qlMap;                //查询的映射. 这样就实现了每次修改SQL or HQL语句后不用重启服务器,立刻看到结果,加快了开发速度.

Hibernate 的HQL,QBC 查询语言

- - ITeye博客
1.HQL:(Hibernate Query Language) 是面向对象的查询语言. String hql="from Deptas model where mode.deptName='人事部' ";. String hql="from Deptas model where mode.deptName like '%部%' ";.

Hibernate 分页查询 HQL查询

- - ITeye博客
/*  前提介绍:. * SQL: 查询的直接对象是数据库中的表(表的结构)--遵循的是国际数据库公共的标准. 只属于Hibernate 这个ORM 框架,查询的对象不是数据库的表,而是表对应的持久化对象;---操作的是对象. 只属于ORM框架,它是没有SQL出现的查询(动态查询),查询只存在对象操作上.

Hibernate HQL注入攻击入门

- - FreeBuf.COM
SQL注入是一种大家非常熟悉的攻击方式,目前网络上有大量存在注入漏洞的DBMS(如MySQL,Oracle,MSSQL等). 但是,我在网络上找不到针对Hibernate查询语言的相关资源. 因此本文总结了笔者在阅读文档和不断试验过程中的一些经验技巧. Hibernate是一种ORM框架,用来映射与tables相关的类定义(代码),并包含一些高级特性,包括缓存以及继承,通常在Java与.NET中使用(可参考 NHibernate),但在Java生态系统中更受欢迎.

HIVE优化提示-如何写好HQL

- - CSDN博客云计算推荐文章
一、     Hive join优化. 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key. 2.     注意带表分区的join, 如:.

自定义 Hibernate 的 HQL 函数

- - CSDN博客互联网推荐文章
 有时候我们使用一些数据库特有的SQL语法跟HQL有冲突怎么办,看看这个. 标签: HQL  Dialect  MySQL  Hibernate. [1].[代码] MySQLExtendDialect.java  跳至  [1]. * 作者: Winter Lau. * 时间: 2009-4-13.