--------------------siwuxie095
HQL 查询
1、HQL,即 Hibernate Query Language,它是 Hibernate 提供
的一种查询语言
2、HQL 和 SQL 很相似,区别在于:
(1)HQL 操作的是实体类和属性
(2)SQL 操作的是表和表中字段
3、常用的 hql 语句
(1)基本查询: from 实体类名
(2)条件查询: from 实体类名 where 属性名 = ?
(3)排序查询: from 实体类名 order by 属性名 asc/desc
4、使用 Query 对象实现 HQL 查询
(1)创建 Query 对象,写 hql 语句
(2)调用 Query 对象的方法得到结果
基本查询
以客户和联系人为例(一对多),下同
1、查询所有记录
(1)创建 Query 对象,写 hql 语句
(2)调用 Query 对象的方法得到结果
2、查询所有的 hql 语句写法:from 实体类名
3、具体实现
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 */ Query query=session.createQuery("from Customer"); /* * (2) 调用方法得到结果 * * 调用 query 的 list() 方法,返回值是 List 类型, * 创建以接收 */ List<Customer> list=query.list(); |
条件查询
1、条件查询的 hql 语句写法
(1)from 实体类名 where 属性名=? and 属性名=?
(2)from 实体类名 where 属性名 like ?
2、具体实现
(1)多条件查询
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 * * hql 语句也可写作(as 可以省略): * from Customer as c where c.cid=? and c.custName=? */ Query query=session.createQuery("from Customer where cid=? and custName=?"); /* * (2) 设置条件 * * 向占位符 ? 中设置值 * * 调用 query 的 setParameter() 方法 * * 和 JDBC 不同,这里的参数位置从 0 开始 */ query.setParameter(0, 1); query.setParameter(1, "百度"); /* * (3) 调用方法得到结果 * * 调用 query 的 list() 方法,返回值是 List 类型, * 创建以接收 */ List<Customer> list=query.list(); |
(2)模糊查询
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 * * hql 语句也可写作(as 可以省略): * from Customer as c where c.custName like ? */ Query query=session.createQuery("from Customer where custName like ?"); /* * (2) 设置条件 * * 向占位符 ? 中设置值 * * 调用 query 的 setParameter() 方法 * * 和 JDBC 不同,这里的参数位置从 0 开始 */ query.setParameter(0, "%度%"); /* * (3) 调用方法得到结果 * * 调用 query 的 list() 方法,返回值是 List 类型, * 创建以接收 */ List<Customer> list=query.list(); |
排序查询
1、排序查询的 hql 语句写法
from 实体类名 order by 属性名 asc/desc
2、具体实现
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 */ Query query=session.createQuery("from Customer order by cid asc"); /* * (2) 调用方法得到结果 * * 调用 query 的 list() 方法,返回值是 List 类型, * 创建以接收 */ List<Customer> list=query.list(); |
分页查询
1、MySQL 实现分页查询
在 sql 语句中使用 limit 关键字
如:select * from t_customer limit 1,3
2、HQL 实现分页查询
(1)在 hql 语句中不能写 limit
(2)Hibernate 的 Query 对象中封装了两个方法可以实现分页操作
3、具体实现
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 */ Query query=session.createQuery("from Customer"); /* * (2) 设置分页数据 * * 开始位置和每页的记录数 */ query.setFirstResult(0); query.setMaxResults(10); /* * (3) 调用方法得到结果 * * 调用 query 的 list() 方法,返回值是 List 类型, * 创建以接收 */ List<Customer> list=query.list(); |
投影查询
1、投影查询:查询部分字段的值,而不是所有字段的值
2、投影查询的 hql 语句写法
select 属性名1, 属性名2 from 实体类名
注意:select 后面不能写 *,即 不支持
3、具体实现
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 */ Query query=session.createQuery("select custName from Customer"); /* * (2) 调用方法得到结果 * * 调用 query 的 list() 方法,返回值是 List 类型, * 创建以接收 */ List<Object> list=query.list(); |
统计查询
1、常用的聚集函数:count、sum、avg、max、min
2、统计查询的 hql 语句写法
select 聚集函数(*) from 实体类名
3、具体实现
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 */ Query query=session.createQuery("select count(*) from Customer"); /* * (2) 调用方法得到结果 * * 调用 query 的 uniqueResult() 方法,返回值是 Object 类型, * 创建以接收 */ Object obj=query.uniqueResult(); /* * 注意:不能直接把 obj 转成 int 类型,需要先转成 Long 类型 * * Long val=(Long) obj; * int valx=val.intValue(); */ |
【made by siwuxie095】