Hibernate试验_05_30.QBC检索方式.doc_第1页
Hibernate试验_05_30.QBC检索方式.doc_第2页
Hibernate试验_05_30.QBC检索方式.doc_第3页
Hibernate试验_05_30.QBC检索方式.doc_第4页
Hibernate试验_05_30.QBC检索方式.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录实践1HQL检索方式21.1简单查询51.2属性查询71.3实例化查询结果81.4连接查询101.5统计函数查询141.6集合过滤161.7子查询21实践1 QBC检索方式实验目的了解QBC的查询方式,掌握常用的限定方法、链接限定、动态查询技术要点l SQL基础知识;l Hibernate基础知识。实验步骤1. 将数据库“HibernateProject02”中的数据清空,然后参照实践“Cascade数据初始化”,重新添加初始化数据2. 运行MyEclipse5.0GA(或更高版本),新建一个“Java Project”,项目名称为“HibernateProject09”,加入mysql-connector-java-3.1.12-bin.jar和Hibernate类库支持,然后在src中创建三层类包。3. 按照实践2 立即检索的第4、5、6步,创建实体对象、map文件及hibernate.cfg.xml文件,最后项目结构如下:4. Team.hbm.xml文件如下:Team.hbm.xml5. Student.hbm.xml文件如下:Student.hbm.xml6. Certificate.hbm.xml文件如下:Certificate.hbm.xml stu 1.1 常用的限定方法7. 在实践HQL检索方式中,我们多次用到where语句进行条件检索,。除了这种方式,Hibernate支持一种符合Java编写习惯的查询API,即Query By Criteria。下面我们看一下和“from Student s where s.age22”语句等价的QBC代码。8. “com.qrsx.hibernate.persistence”中创建StudentDAO.java,代码如下:StudentDAO.java /* * 常用的限定方法 */ public static void simpleQuery() try session = HibernateUtil.currentSession(); / 开启连接 tx = session.beginTransaction(); / 开启事务 Criteria criteria=session.createCriteria(Student.class); /Restrictions.gt()方法表示great-than,也就是大于的情况 criteria.add(Restrictions.gt(age,new Integer(22); List list = criteria.list(); for( int i=0 ; ilist.size(); i+ ) Student student = (Student)list.get(i); System.out.println(student.getName(); /查询年龄在20-30之间的所有学生对象 List list1 = session.createCriteria(Student.class) .add(Restrictions.between(age, new Integer(20), new Integer(30).list(); /查询Student名字开头有t的所有Student List list2 = session.createCriteria(Student.class) .add(Restrictions.like(name, t%).list(); /查询Student中age属性为null的对象 List list3 = session.createCriteria(Student.class) .add(Restrictions.isNull(age).list(); /其他限定方法的应用,请见课件 mit(); catch (HibernateException e) / 捕捉例外 e.printStackTrace(); tx.rollback(); finally HibernateUtil.closeSession(session); 9. 建立StudentManager.java,代码如下:StudentManager.java:/* * (#)StudentManager.java Jul 5, 2007 * Copyright 2007 qingdaosoftware, Inc. All rights reserved */package com.qrsx.hibernate.business;import com.qrsx.hibernate.persistence.StudentDAO;/* * * Company : 青软实训 * Author : 王希涛 * Version : 1.0 * Date : Jul 5, 2007 */public class StudentManager /* * param args */ public static void main(String args) StudentDAO.simpleQuery(); 10. 运行StudentManager,查看运行结果。11. 参考课件练习其他的限定方法。1.2 连接限定12. 在HQL,可以通过fetch关键字来指定预先抓取,如下所示Hqlfrom Team t left join fetch t.student s where t.teamName like %213. 我们可以使用Criteria的API完成同样的功能,在StudentDAO.java中新建joinQuery()方法,代码如下:StudentDAO.java /* * 常用的限定方法 */ public static void joinQuery() try session = HibernateUtil.currentSession(); / 开启连接 tx = session.beginTransaction(); / 开启事务 /List list=session.createQuery(from Team t left join fetch t.students s where t.teamName like %2).list(); Criteria criteria = session.createCriteria(Team.class) .setFetchMode(students, FetchMode.EAGER) .add(Restrictions.like(teamName,2,MatchMode.END); List list = criteria.list(); for( int i=0 ; ilist.size(); i+ ) Team team = (Team)list.get(i); System.out.println(team.getTeamName(); mit(); catch (HibernateException e) / 捕捉例外 e.printStackTrace(); tx.rollback(); finally HibernateUtil.closeSession(session); 14. 修改StudentManager.java,代码如下:StudentManager.java: public static void main(String args) StudentDAO.joinQuery(); 15. 运行StudentManager,控制台执行结果如下:Eclipse Console:Hibernate: select t.*,s.*,c.* from team t left outer join student s on t.id=s.team_id left outer join certificate c on s.id=c.id where t.teamName like ?1.3 动态查询16. 比如在web页面的组合查询,根据学生的姓名和年龄查询匹配的学生列表。下面的程序通过对字符串的拼装使用HQL语句实现动态查询Hql拼装 public List findStu(String name, int age) StringBuffer queryString = new StringBuffer(); boolean conditionFound = false; if(name !=null) queryString.append(lower() like :name); conditionFound = true; if(age != 0) if(conditionFound) queryString.append(and); queryString.append(s.age = :age); conditionFound=true; String fromClause = conditionFound?from Student s where:from Student s; queryString.insert(0,fromClause).append(order by ); Query query = getSession().createQuery(queryString.toString(); if(name!=null) query.setString(name,%+name.toLowerCase()+%); if(age !=0) query.setInteger(age,new Integer(age); return query.list(); 17. 上面的代码虽然可以正常工作,但是把简单的功能实现的相当复杂,维护起来不方便。我们来看一下使用QBC查询,在StudentDAO.java中新建dynamicQuery()方法,代码如下:StudentDAO.java /* * 动态查询 * param name * param age * return */ public static List dynamicQuery(String name, int age) try session = HibernateUtil.currentSession(); / 开启连接 tx = session.beginTransaction(); / 开启事务 Criteria crit = session.createCriteria(Student.class); if(name!=null) crit.add(Restrictions.like(name,name,MatchMode.ANYWHERE); if(age!=0) crit.add(Restrictions.eq(age,new Integer(age); crit.addOrder(Order.asc(name); mit(); return crit.list(); catch (HibernateException e) / 捕捉例外 e.printStackTrace(); tx.rollback(); finally HibernateUtil.closeSession(session); return null; 18. 修改StudentManager.java,代码如下:StudentManager.java: /* * param args */ public static void main(String args) StudentManager.dynamicQuery(); public static void dynamicQuery() String name=王; int age = 22; List list = StudentDAO.dynamicQuery(name, age); for( int i=0; ilist.size(); i+ ) Student stu = (Student)list.get(i); System.out.println(stu.getName() + + stu.getAge(); 19. 运行StudentManager,控制台执行结果如下:Eclipse Console:Hibernate: select s.*,c.* from student s inner join certificate c on s.id=c.id where like ? and s.age=? order by asc王静 22 1.4 QBE查询方式20. 在查询表单中填写的项,往往可以将其封装成一个对象。21. 在StudentDAO.java中新建qbeQuery()方法,代码如下:StudentDAO.java /* * QBE查询 * param name * param age * return */ public static List qbeQuery(Student stu) List list=null; try session = HibernateUtil.currentSession(); / 开启连接 tx = session.beginTransaction(); / 开启事务 Example exampleStu =Example.create(stu).ignoreCase()/忽略大小写 .enableLike(MatchMode.ANYWHERE) /对所有String属性进行like匹配 .excludeProperty(age);/不把age字段加入到where条件句中 list= session.createCriteria(Student.class) .add( exampleStu ) .list(); mit(); catch (HibernateException e) / 捕捉例外 e.printStackTrace(); tx.rollback(); finally HibernateUtil.closeSession(session); return list; 22. 修改StudentManager.java,代码如下:StudentManager.java: /* * param args */ public static void main(String args) StudentManager.qbeQuery(); public static void qbeQuery() Student stu = new Student(); stu.setName(王); stu.setAge(22); List list = StudentDAO.qbeQuery(stu); for( int i=0; ilist.size(); i+ ) Student student = (Student)list.get(i); System.out.println(student.getName() + + student.getAge(); 23. 运行StudentManager,控制台执行结果如下:Eclipse Console:Hibernate: select s.*,c.* from student s inner join certificate c on s.id=c.id where (lower() like ?)王静 22王伟 231.5 分页查询24. 在查询表单中填写的项,往往可以将其封装成一个对象。25. 在StudentDAO.java中新建qbeQuery()方法,代码如下:StudentDAO.java /* * QBE查询 * param name * param age * return */ public static List pageQuery() List list=null; try session = HibernateUtil.currentSession(); / 开启连接 tx = session.beginTransaction(); / 开启事务 /HQL检索方式 Query q = session.createQuery(from Student s order by ); q.setFirstResult(3); /从index为3的记录开始 q.setMaxResults(10); /最多获取10条记录 list = q.list(); /Criteria检索方式 Criteria cri = session.createCriteria(Student.class); cri.addOrder(Order.asc(name) .setFirstResult(3) .setMaxResults(10); list = cri.list(); mit(); catch (HibernateException e) / 捕捉例外 e.printStackTrace(); tx.rollback(); finally HibernateUtil.closeSession(session); return list; 26. 修改StudentManager.java,代码如下:StudentManager.java: /* * param args */ public static void main(String args) StudentDAO.pageQuery(); 27. 运行StudentManager,分别执行两种分页检索方式,执行结果如下:Eclipse Console:Hibernate: select * from student s order by limit ?, ?Hibernate: select s.*,c.* from student s inner join certificate c on s.id=c.id order by this_.name asc limit ?, ?1.6 DetacheCriteria28. Hibernate3支持DetachedCriteria,这是一个很有用的特性。在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件动态生成SQL语句进行查询。29. 在StudentDAO.java中新建detacheQuery()方法,代码如下:StudentDAO.java /* * detched查询 * param name * param age * return */ public static List detachedQuery(DetachedCriteria detachedCriteria) List list=null; try session = HibernateUtil.currentSession(); / 开启连接 tx = session.beginTransaction(); / 开启事务 Criteria criteria = detachedCriteria.getExecutableCriteria(session); list = criteria.list(); mit(); catch (HibernateException e) / 捕捉例外 e.printStackTrace

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论