第五章 HQL实用技术
第五章 HQL实用技术
5.1 使用HQL查询语句(面向对象查询语句)
5.1.1 编写HQL语句
5.1.1.1 from子句
例:from com.entity.Dept;
from Dept dept;--为持久化类Dept指定了别名dept;可省略包名
5.1.1.2 select子句
例:select dept from Dept as dept;
select dept.DeptName from Dept as dept;--选取单个属性,可选择多个
5.1.1.3 where子句
例:from Dept where DeptName='SALES';
from Dept dept where dept.DeptName='SALES';
from Dept dept where dept.location is not null;--查询地址不为空的部门
5.1.1.4 表达式
例:from Dept dept where lower(dept.DeptName)='sales';--lower()把字符串中的字母转换成小写
from Emp where year(hireDate)=1980;--year()用于获取日期字段的年份
5.1.1.5 order by子句
例:from Emp order by hireDate asc
from Emp order by hireDate,salary desc;
5.1. 执行HQL语句
5.1.2.1 声明变量并初始化
String hql = "from Emp";
构建Query对象
Query query = session.createQuery(hql);
两种执行方式
1、使用list()方法执行查询
2、使用iterator()方法执行查询
执行HQL语句步骤
1、获取session对象
2、编写HQL语句
3、创建Query对象
4、执行查询
5.2 在HQL查询语句中绑定数据
5.2.1 参数绑定形式
5.2.1.1 按参数位置绑定
例:Query query = session.createQuery("from Emp where job=? and salary>?");
query.setString(0,job);--第一个参数位置为零
query.setDouble(1,salary);
5.2.1.2 按参数名称绑定
例:Query query = session.createQuery("from Emp where job=:empJob and salary>:empSalary");
query.setString("empJob",empJob);
query.setDouble("empSalary",empSalary);
名称绑定和位置绑定:
1、使程序代码有较好的可读性
2、按名称绑定的形式有利于程序代码的维护,
5.2.2 绑定各种类型的参数
setBoolean():绑定类型为Boolean的参数
setByte():绑定类型为Byte的参数
setDouble():绑定类型为Double的参数
setDate():绑定类型为Date的参数
setString():绑定类型为String的参数
以上方法都有两种重载方式 如:
setString(int position,String val);--按位置绑定参数
setString(String name,String val);--按名称绑定参数
5.2.2.1 setParameter()方法:绑定任意类型参数
例:Query query = session.createQuery("from Emp where job=:empJob and salary>:empSalary");
query.setParameter("empJob",empJob);
query.setParameter("empSalary",empSalary);
5.2.2.2 setProperties()方法:绑定命名参数与一个对象的属性值
例: Dept depts=new Dept();
depts.setName("sales");
String hql="from Dept as dept where dept.deptName=:name";
Query query=session.createQuery(hql);
query.setProperties(depts);
List result=query.list();
5.2.3 使用uniqueResult()方法获取唯一结果
当查询结果不唯一时,不能使用query.uniqueResult()方法,否则会报错
5.3 分页和投影
5.3.1 实现数据分页查询
使用Query接口的setFirstResult(int firstResult)和setMaxResults(int maxResults)
setFirstResult(int firstResult):用与设置第一条记录的位置
setMaxResults(int maxResults):用于设置最大返回的记录条数
具体步骤:
1、使用聚合函数count()获取总记录数count;
2、计算总页数
int totalpages=(count% pageSize==0)?(count/pageSize):(count/pageSize+1);--pageSize保存每页显示的记录数
3、实现分页
query.setFirstResult((pageIndex-1)*pageSize);--pageIndex为当前页码
query.setMaxResults(pageSize);
List result=query.list();--得到分页查询的结果
5.3.2 使用投影查询
1)将每条查询结果封装成Object对象
2)将每条查询结果封装成Object数组
3)将每条查询结果通过构造函数封装成对象
5.4 使用MyEclipse反向工具
1、新建工程后,添加Hibernate支持
2、选择Hibernate3.3版本
3、创建Hibernate配置文件
4、配置数据库连接信息
5、生成持久化类和映射文件
6、进入数据库窗口
7、选择右键菜单Hibernate Reverse Engineering
8、选择主键生成器