加载中...

Hibernate(九)HQL查询


一、Hibernate提供的查询方式

  • OID查询方式:主键查询。通过get()或者load()方法加载指定OID的对象查询结果为一个
  • HQL查询方式:通过Query接口使用HQL语言进行查询
  • QBC查询方式:通过Criteria等接口和类进行是查询
  • 本地SQL查询方式:使用原生的SQL语言进行查询
  • 对象导航查询方式:通过已经加载的对象,导航到其关联对象

其中HQL和QBC是Hibernater提供的专业的查询方式

HQL查询方式为官方推荐的标准查询方式

二、HQL查询简述

HQL:Hibernate Query Language

这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。

例如:

  1. //1.得到session
  2. Session session=HibernateSessionFactory.getSession();
  3. //2。创建查询语句这里的Student为持久化类的,类名
  4. String hql="from Student";
  5. //String hql="from Student where sname='张三'";
  6. //3.创建Query对象
  7. Query query=session.createQuery(hql);
  8. //4.执行查询 返回结果为list集合
  9. List<Student> list=query.list();
  10. //5.输出结果
  11. for (Student stu : list) {
  12. System.out.println(stu.getSname()+stu.getSex());
  13. }

 三、最简单的查询

查询全部信息

  1. from Student //直接使用持久化类名
  2. from com.pb.entity.Student //使用全路径

 通常我们不需要使用类的全限定名, 因为 auto-import(自动引入) 是缺省的情况。 

也可以为类名指定别名

  1. from Student as s //使用as 关键字指定类的别名
  2. from Student s //省略as 关键字指定类的别名

四、where子句

也可以支持where子句

  1. from Student where sid=201503011
  2. from Student s where s.sid=201503011

4.1、在where中可以使用各种运算符 

例如:

  1. from Student where sex='男' and sid<11070200
  2. //查询学生性别 为男同时,学号小于 11070200的学生
  3. from Student where sid between 11070100 and 11070200
  4. //查询学生学号在11070100 and 11070200之间的学生
  5. from Student where snamelike '%飞';
  6. //查询学生姓名最后一个字为飞的全部学生
  7. from Student where sname like '_ik*';
  8. //查询学生姓名,第一个字为任意,第2个为i,第3个为k,后面任意长度的学生

其中"-"匹配单个字符

"%"匹配任意长度的字符

"_"不可以进行汉字匹配,"%"可以进行汉字匹配

 五、返回结果

Query的方法

5.1、list()方法

  1. //1.得到session
  2. Session session=HibernateSessionFactory.getSession();
  3. //2。创建查询语句这里的Student为持久化类的,类名
  4. String hql="from Student";
  5. //String hql="from Student where sid=201503011 ";
  6. //3.创建Query对象
  7. Query query=session.createQuery(hql);
  8. //4.执行查询 返回结果为list集合
  9. List<Student> list=query.list();
  10. //5.输出结果
  11. for (Student stu : list) {
  12. System.out.println(stu.getSname()+stu.getSex());
  13. }

5.2、iterate()方法

  1. //1.得到session
  2. Session session=HibernateSessionFactory.getSession();
  3. //2。创建查询语句这里的Student为持久化类的,类名
  4. String hql="from Student";
  5. //String hql="from Student where sid=201503011 ";
  6. //3.创建Query对象
  7. Query query=session.createQuery(hql);
  8. //4.执行查询 返回结果为Iterator
  9. Iterator<Student> iterator=query.iterate();
  10. //5.输出结果
  11. while(iterator.hasNext()){
  12. Student stu=iterator.next();
  13. System.out.println(stu.getSname()+stu.getSex());
  14. }

5.3、uniqueResult()方法

返回的结果为一个对象,一般用来根据主键查询

  1. //1.得到session
  2. Session session=HibernateSessionFactory.getSession();
  3. //2。创建查询语句这里的Student为持久化类的,类名
  4. //String hql="from Student";
  5. String hql="from Student where sid=201503011 ";
  6. //3.创建Query对象
  7. Query query=session.createQuery(hql);
  8. //4.执行查询 返回结果为Object类型,
  9. Student student=(Student) query.uniqueResult();
  10. //5.输出结果
  11. System.out.println(student.getSname()+student.getSex());

5.4、list()和iterate()方法区别

两都的查询机制不同

使用list()时,只需要查询一次就可以完成全部持久化类的,全部字段的查询

使用iterate()时,第一次查询出来的是全部记录的主键ID,然后再去系统缓存中查询相应的记录,如果有这个ID的记录, 将不进行数据库查询,如果没有将进行数据库查询,有多少条记录就要查询1+N次。

六、属性查询(投影查询)

6.1、直接指定属性查询

返回结果为Object数组,数组的长度为属性的个数

  1. public static void findByproperty(){
  2. //1.得到session
  3. Session session=HibernateSessionFactory.getSession();
  4. //2。创建查询语句这里的Student为持久化类的,类名
  5. //String hql="from Student";
  6. String hql="select sid,sname,sex from Student ";
  7. //3.创建Query对象
  8. Query query=session.createQuery(hql);
  9. //4.执行查询 返回结果为Object类型,
  10. List list=query.list();
  11. //5.输出结果
  12. for (Object object : list) {
  13. //结果为查询属性数据 的Object对象数组
  14. Object [] obj=(Object[]) object;
  15. System.out.println(obj[0]+"\t"+obj[1]+"\t"+obj[2]);
  16. }
  17. }

6.2、使用构造方法查询

前提是持久化类中要有这个构造方法

返回结果为持久化类的对象集合

  1. public static void findByCons(){
  2. //1.得到session
  3. Session session=HibernateSessionFactory.getSession();
  4. //2。创建查询语句这里的Student为持久化类的,类名
  5. //String hql="from Student";
  6. String hql="select new Student(sid,sname,sex) from Student ";
  7. //3.创建Query对象
  8. Query query=session.createQuery(hql);
  9. //4.执行查询 返回结果为Object类型,
  10. List<Student> list=query.list();
  11. //5.输出结果
  12. for (Student stu : list) {
  13. System.out.println(stu.getSname()+"\t"+stu.getSex());
  14. }
  15. }

这种更直接,明了解,一定要有相应的构造方法

 七、实体更新和删除

7.1、更新

  1. Session session =new Configuration().configure().buildSessionFactory().openSession();
  2. Student stu=(Student) session.get(Student.class, 201509009);
  3. Course cou=(Course) session.get(Course.class, 2222);
  4. Transaction tran=session.beginTransaction();
  5. stu.getCourses().add(cou);
  6. session.update(stu);
  7. tran.commit();
  8. session.close();
View Code

7.2、删除

  1. Session session =new Configuration().configure().buildSessionFactory().openSession();
  2. Student stu=(Student) session.get(Student.class, 201509009);
  3. Course cou=(Course) session.get(Course.class, 2222);
  4. Transaction tran=session.beginTransaction();
  5. stu.getCourses().remove(cou);
  6. session.update(stu);
  7. tran.commit();
  8. session.close();
View Code

八、参数绑定

8.1占位符、

和JDBC中一样使用?来占位

8.2、命名参数

九、排序

十、统计函数

 

  1. public static void findCount(){
  2. Session session=new Configuration().configure().buildSessionFactory().openSession();
  3. /*String hql="from Emp";
  4. Query query=session.createQuery(hql);
  5. List list=query.list();
  6. int count=list.size();*/
  7. String hql="select count(*) from Emp";
  8. Query query=session.createQuery(hql);
  9. Long count=(Long) query.uniqueResult();
  10. System.out.println("员工表总记录数:"+count);
  11. }
View Code

 


还没有评论.