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