一、分组查询
使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计
1.1 聚合函数:常被用来实现数据统计功能
① count() 统计记录条数
② sum() 求和
③ min() 求最小值
④ max() 求最大值
⑤ avg() 求平均值
例子:查询所有员工的平均工号
注:select语句查询出来只有一个值,因此不能用list(),list投影出来的是一个集合。在这里提供uniqueResult()方法
/*
* 分组查询 所有员工的平均工号
*/ @Test
public void avgTest(){
Query query=session.createQuery("select avg(empId) from Emp");
Object count=query.uniqueResult();
System.out.println(count);
}
输出结果:
二、子查询
子查询语句应用于HQL查询语句的where子句中。
子查询关键字:
all:子查询语句返回的所有记录
any:子查询语句返回的任意一条记录
some:和“any”意思相同
in:与“=any”意思相同
exists:子查询语句至少返回一条记录
例子:查询所有员工工资都小于2000的部门
/*
* 子查询 查询所有员工工资都小于2000的部门
*/ @Test
public void childTest(){
List<Dept> list=session.createQuery("from Dept d where 2000>all(select e.sal from d.emps e) and d.emps.size>0").list();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}
}
输出结果:
三、原生SQL查询和命名查询
注:对于原生SQL查询方式,使用Session的createSQLQuery()方法来创建SQLQuery对象,createSQLQuery()方法的参数是底层数据库的sql语句,SQLQuery接口继承了Query接口。该语句不能返回强类型的Dept对象,需使用addEntity()封装到一个Dept实体类
例子:查询部门名称
/*
* 原生sql
*/ @Test
public void sqlTest(){
SQLQuery query=session.createSQLQuery("select * from dept1").addEntity(Dept.class);
List<Dept> list=query.list();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}
}
输出结果:
命名查询:在映射文件中定义字符串形式的查询语句
将SQL语句配置到一个文件
如图所示: