• 1. 第六章Criteria查询及命名查询第三单元第1页/共29页
  • 2. 本章相关学习资源 《使用Criteria查询数据》专题 《使用命名查询与本地SQL》专题 《使用Hibernate升级新闻管理系统》 第6章 《Criteria查询及命名查询》 第2页/共29页学习平台“Hibernate实现数据持久化”课程学生用书
  • 3. 预习检查简述如下代码的作用 如何使用Criteria实现分页 简述实现命名HQL查询的步骤Criteria criteria = session.createCriteria(Login.class); criteria.add(Restrictions.eq("username","Tom")); result = criteria.list(); 第3页/共29页提问
  • 4. 本章任务任务1:使用Criteria查询特定房屋信息 任务2:使用Criteria分页查询房屋信息 任务3:使用命名HQL查询特定房屋信息 任务4:使用命名SQL查询特定房屋信息 任务5:使用命名SQL调用存储过程第4页/共29页
  • 5. 本章目标第5页/共29页使用Criteria查询数据使用命名查询使用本地SQL查询点重点重使用Hibernate调用存储过程点难
  • 6. 串讲:Criteria查询用到特定于数据库的SQL语句,程序本身会依赖于特定的数据库 不了解SQL语句,恐怕对使用HQL带来困难Hibernate提供的Criteria查询帮助 我们解决了这种问题 第6页/共29页提问
  • 7. 串讲: Criteria查询Criteria查询采用面向对象方式封装查询条件,又称为对象查询 由Hibernate 自动产生SQL查询语句 Criteria由Hibernate Session进行创建 Criteria criteria = session.createCriteria(Login.class);select * from login;第7页/共29页
  • 8. 串讲:限制结果集内容使用Criteria的add()方法加入“条件实例”,条件实例是由Restrictions的各种静态方法返回的 方法说明Restrictions.eq()对应SQL的等于(=)Restrictions.gt()对应SQL的大于(>)Restrictions.ge()对应SQL的大于等于(>=)Restrictions.lt()对应SQL的小于(<)Restrictions.le()对应SQL的小于等于(<=)Restrictions.between()对应SQL的between子句Restrictions.like()对应SQL的like子句Restrictions.in()对应SQL的in子句Restrictions.and()对应SQL的andRestrictions.or()对应SQL的or第8页/共29页
  • 9. 上机练习需求说明 租房系统中,以标题(title)、价格(price)范围和面积(floorage)范围为条件使用Criteria对租房信息进行综合的“模糊”查询 完成时间:15分钟共性问题集中讲解第9页/共29页练习
  • 10. 串讲:Criteria查询结果集排序 使用org.hibernate.criterion.Order Example示例查询(QBE,Query By Example) 依照已有对象,查询与其属性相同或相似的其他对象 criteria.addOrder(Order.desc("age"));asc():升序 desc():降序Login user = new Login(); user.setAge(21); …… Criteria criteria = session.createCriteria(Login.class); criteria.add(Example.create(user));Hibernate 在自动生成SQL 语句时将自动过滤掉对象的空属性,根据有非空属性值的属性生成查询条件 演示示例:使用Example示例查询第10页/共29页
  • 11. 串讲: Criteria查询统计、分组 org.hibernate.criterion.Projections 方法说明Projections.rowCount()统计记录数Projections.avg()统计平均值Projections.max()统计最大值Projections.min()统计最小值Projections.groupProperty()分组Projections.count()统计某一字段的非空记录数Projections.sum()针对某一字段求和第11页/共29页
  • 12. 讲解: Criteria查询criteria.setProjection(Projections.rowCount()); criteria.setProjection(Projections.avg("age")); criteria.setProjection(Projections.max("age")); criteria.setProjection(Projections.groupProperty("username"));criteria.setProjection(Projections.projectionList() .add(Projections.groupProperty("username"))//按用户名分组 .add(Projections.rowCount())//统计所有记录数 .add(Projections.avg("age"))//统计平均年龄 .add(Projections.max("age"))//统计最大年龄 ); 演示示例:使用Criteria分组、统计第12页/共29页
  • 13. 讲解: Criteria查询分页 Criteria criteria = session.createCriteria(Login.class); //从第一条记录之后开始 criteria.setFirstResult(1); //返回两条记录 criteria.setMaxResults(2); result = criteria.list(); 第13页/共29页
  • 14. 上机练习需求说明 租房系统中,使用Criteria对租房信息进行分页查询,每页显示2条,显示第2页的房屋信息 完成时间:15分钟共性问题集中讲解第14页/共29页练习
  • 15. 讲解:命名HQL查询修改相应配置文件 在程序中使用Session的 getNamedQuery()获取在映射配置文件中添加的HQL查询语句 第15页/共29页
  • 16. 上机练习需求说明 租房系统中,使用命名HQL查询实现对特定房型的租房信息查询的功能 完成时间:15分钟共性问题集中讲解第16页/共29页练习
  • 17. 串讲:本地SQLHQL并不能涵盖所有查询特性,有时不得不借助SQL以达到期望目标,这就是本地SQL(NativeSQL) Hibernate 对本地SQL查询提供了内置的支持 String sql = "select {l.*} from login l where l.username='Tom'"; SQLQuery query = session.createSQLQuery(sql).addEntity("l",Login.class); List result = query.list(); 演示示例:使用SQLQuery查询第17页/共29页
  • 18. 串讲:命名SQL查询修改相应配置文件 在程序中使用Session的 getNamedQuery() 获取在映射配置文件中添加的SQL查询语句 第18页/共29页
  • 19. 上机练习需求说明 使用SQLQuery修改上一个上机练习。实现在租房系统中对特定房型的租房信息查询的功能 使用命名SQL修改以上代码,实现同样功能 完成时间:20分钟共性问题集中讲解第19页/共29页练习
  • 20. 串讲:定制SQL映射标记 重载了Hibernate中持久化的类和集合已经包含的一套配置期产生的语句 insert into login (password,age,username) values(?,?,?) update login set password =?,age=? where username=? delete from login where username=? 此时,使用Session操作对象时,不会再使用自动生成的SQL语句,而是使用自定义的SQL语句第20页/共29页
  • 21. 串讲: Hibernate调用存储过程使用命名SQL 使用CallableStatement使用定制SQL存储过程三种调用方式 第21页/共29页
  • 22. 定义存储过程串讲: Hibernate调用存储过程使用命名SQL调用存储过程的步骤 12 修改实体类映射配置文件,添加元素 通过Session的getNamedQuery() 获取Query对象3第22页/共29页
  • 23. 串讲: Hibernate调用存储过程使用命名SQL调用存储过程 {call proc_name(param1,param2)} Query query = session.getNamedQuery(""); …省略代码… query.executeUpdate(); //List list = query.list(); 演示示例:命名SQL调用存储过程第23页/共29页
  • 24. 串讲: Hibernate调用存储过程1通过Session获得Connection2通过prepareCall()封装调用存储过程的语句3CallableStatement的setXxx()或registerOutParameter()为存储过程传参4executeUpdate()或execute()执行存储过程第24页/共29页使用CallableStatement调用存储过程
  • 25. 上机练习需求说明 使用命名SQL调用存储过程,实现在租房系统中对特定房型的租房信息查询的功能 分析: 编写Oracle存储过程时,返回结果(游标)必须作为第一个参数。除了游标外的其他输入参数下标从0开始 完成时间:15分钟共性问题集中讲解第25页/共29页练习
  • 26. 答疑时间同学们请就以下方面的问题请教老师 (教员备课时自行填写)第26页/共29页
  • 27. 总结如何使用Criteria进行查询排序? 如何使用Example查询已有实体对象的类似对象? 在映射文件中如何定义命名查询? 如何使用本地SQL查询? 第27页/共29页提问
  • 28. 作业 必做 教员备课时在此添加内容 选做 教员备课时在此添加内容 提交时间:xxx 提交形式:xxx 阅读学生用书第 7 章,观看平台《使用缓存提高查询性能》、《使用注解简化映射配置》、《升级新闻管理系统》相关专题课件 教员备课时在此添加内容 第28页/共29页课后作业预习作业
  • 29. 第29页/共29页