丁勇 Email:18442056@QQ.com
学习目标 掌握 HQL 查询 掌握 Criteria 查询
为什么使用 HQL 如何使用 Hibernate 查询所有房屋信息? SQL 语句 : select * from tbl_fwxx Hibernate 中如何实现查询 HQL Hibernate Query Lanuage Hibernate 查询语言
如何使用 HQL 使用 HQL 的四步 1 得到 得到 Session 2 编写 编写 HQL HQL 语句语句 可以没有 select 子句 from TblFwxx 4 2 1 3 3 创建 创建 Query Query from 关键字, 类似于 SQL 语句 实体类名, 而不是数据库表名 4 执行查询
如何使用 HQL 类似 SQL SELECT 语句, 可以使用表的别名 HQL 是面向对象的查询语言 select fw 表示查询 fw 对象 select fw from TblFwxx as fw 表的别名, as 可以省略 执行结果与 from TblFwxx 相同
常见错误 下面代码中有什么错误, 怎么更正? tbl_fwxx 是表名 HQL 是对象查询语言, 应该是类名 :TblFwxx
常见错误 下面代码中有什么错误, 怎么更正? 类名是区分大小写的 应该是 TblFwxx 但 SELECT FROM 等关键字是不区分大小写的
属性查询 select fw from TblFwxx fw 将查询整个对象信息, 我们只想查询 date 和 title 怎么做? select fw.title, fw.date from TblFwxx fw 查询结果仍保存在 list 中 每条数据封装成一个 Object 数组
小结 实现 QxDAO 接口 : public interface QxDAO{ public List listallqx(); }
参数查询 如何实现 : 根据 title 模糊查询房屋信息? select fw from TblFwxx fw where fw.title like '% 健翔桥 %' 支持 '%' 通配符 wher e 子句 支持 like 关键字 这样拼装 HQL 字符串容易带来安全隐患
参数查询 HQL 提供类似 preparedstatement 的参数查询 以 '?' 为占位符 Query 提供 setlong,setdouble,setdate 等方法用于设置不同类型的参数值 设置参数的值 注意 : 1. 必须保证 :query 设置参数的数目 == hql 语句中占位符的数目 2. 占位符下标从 0 开始
参数查询 支持 查询租金在 zj1 到 zj2 范围内的租房信息 : : public List searchbyzj(int and or zj1, not int 和括号 zj2) ; > < = >= <= <> 和 is null; public List searchbyzj(int zj1, in 和 int between zj2){ Session session = this.getsession(); String hql = "from TblFwxx fw " +"where fw.zj >=? and fw.zj <=?"; } Query query = session.createquery(hql); query.setinteger(1, zj1); 当参数数目增多时, 代码可读性 query.setinteger(2,zj2); 下降 ; 将下标顺序硬编码, 参数 return query.list(); 顺序有调整则代码也要调整 当参数数目增多的时候使用 between 关键字上面的, 上面的代码会带来什么问题 hql 语句怎么写??
参数查询 : 命名参数 查询租金在 zj1 到 zj2 范围内的租房信息 使用 : 参数名 的格式定义命名参数 设定命名参数的值
小结 根据房屋类型查询 :public List searchbyjd(int jdid); 提示 :...where fw.jd.jdid =? 或者...where fw.jd.jdid = :jdid
关联查询 查询 : 联系人为 伊先生 的房屋信息都分布在哪些街道 从两类对象中检索数据 设置关联条件 注意 :jd 是对象 生成的 SQL 语句
小结 写出 HQL 语句 : 查询 亚运村 街道的房屋信息中, 涉及的房屋类型 提示提示 : 亚运村街道的房屋信息 : fw.jd.jdid=39
分页查询 实现分页查询方法 :public List search(int pageno, int pagesize) 使用 order by 对结果排序 分页代码
统计函数 在实现分页功能时, 我们需要知道总记录数以便计算总页数 使用 count() 函数 当结果只有一条记录时, 可以使用 uniqueresult() 得到结果 可以使用的函数还有 :min() max() avg()
小结 写出程序代码 : 1 根据租金排序, 查询从高到低前 10 条记录 String hql = "from TblFwxx fw order by fw.zj desc";... query.setfirstresult(0); query.setmaxresult(10); 2 查询朝阳区房屋租金的平均值 String hql = "select avg(fw.zj) from TblFwxx fw " + +"where fw.jd. tblqx.qx=' 朝阳区 '";... double avgzj = (Double)query.uniqueResult();
对象查询 使用一个查询方法, 同时支持三项功能 : 对 title 模糊查询 对房屋类型精确查询 public 对租金使用一个范围查询 List search(tblfwxx condition){ } String hql = "select fw from TblFwxx fw " 代码啰嗦 hql += "where 1=1 ";, 不易维护 if (condition.gettitle()!=null){ hql += "and fw.title like '%" + condition.gettitle() + "%' "; }... 使用 Criteria 查询代码更简洁 不方便使用参数查询, 安全性和执行效率不好
使用 Criteria 查询 以对象的方式构建查询 创建 Criteria 对象 模糊查询 大于等于和小于等于 支持 in 和 betwee n 支持类似 EL 表达式的属性浏览语法 可以增加多个排序规则 数组类型
测试程序和运行效果 使用 Criteria 查询 生成的生成的 SQL SQL 语句语句 : Hibernate: select select this_.fwid as as fwid1_0_, this_.uid as as uid1_0_, this_.jdid as as jdid1_0_, this_.lxid as as lxid1_0_, this_.shi as as shi1_0_, this_.ting as as ting1_0_, this_.fwxx as as fwxx1_0_, this_.zj as as zj1_0_, this_.title as as title1_0_, this_.date as as date1_0_, this_.telephone as as telephone1_0_, this_.lxr as as lxr1_0_ from from TBL_FWXX this_ this_ where where this_.title like like? and and this_.zj>=? and and this_.zj<=? and and this_.lxid in in (?, (?,?)?) order order by by this_.fwid asc asc
总结 HQL 的全称是? 和 SQL 相比,HQL 有哪些特点? HQL 语句为 :select jd.jdid,jd.jd from TblJd jd 怎样获得并显示查询结果? 使用 '?' 做占位符的参数查询, 怎样设置参数的值? 命名参数查询的语法是? 怎样创建 Criteria 查询对象?