其中HQL和QBC是Hibernater提供的专业的查询方式
HQL查询方式为官方推荐的标准查询方式
HQL:Hibernate Query Language
这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。
例如:
- //1.得到session
- Session session=HibernateSessionFactory.getSession();
- //2。创建查询语句这里的Student为持久化类的,类名
- String hql="from Student";
- //String hql="from Student where sname='张三'";
- //3.创建Query对象
- Query query=session.createQuery(hql);
- //4.执行查询 返回结果为list集合
- List<Student> list=query.list();
- //5.输出结果
- for (Student stu : list) {
- System.out.println(stu.getSname()+stu.getSex());
- }
查询全部信息
- from Student //直接使用持久化类名
- from com.pb.entity.Student //使用全路径
通常我们不需要使用类的全限定名, 因为 auto-import(自动引入) 是缺省的情况。
也可以为类名指定别名
- from Student as s //使用as 关键字指定类的别名
- from Student s //省略as 关键字指定类的别名
也可以支持where子句
- from Student where sid=201503011
- from Student s where s.sid=201503011
例如:
- from Student where sex='男' and sid<11070200
- //查询学生性别 为男同时,学号小于 11070200的学生
- from Student where sid between 11070100 and 11070200
- //查询学生学号在11070100 and 11070200之间的学生
- from Student where snamelike '%飞';
- //查询学生姓名最后一个字为飞的全部学生
- from Student where sname like '_ik*';
- //查询学生姓名,第一个字为任意,第2个为i,第3个为k,后面任意长度的学生
其中"-"匹配单个字符
"%"匹配任意长度的字符
"_"不可以进行汉字匹配,"%"可以进行汉字匹配
Query的方法
- //1.得到session
- Session session=HibernateSessionFactory.getSession();
- //2。创建查询语句这里的Student为持久化类的,类名
- String hql="from Student";
- //String hql="from Student where sid=201503011 ";
- //3.创建Query对象
- Query query=session.createQuery(hql);
- //4.执行查询 返回结果为list集合
- List<Student> list=query.list();
- //5.输出结果
- for (Student stu : list) {
- System.out.println(stu.getSname()+stu.getSex());
- }
- //1.得到session
- Session session=HibernateSessionFactory.getSession();
- //2。创建查询语句这里的Student为持久化类的,类名
- String hql="from Student";
- //String hql="from Student where sid=201503011 ";
- //3.创建Query对象
- Query query=session.createQuery(hql);
- //4.执行查询 返回结果为Iterator
- Iterator<Student> iterator=query.iterate();
- //5.输出结果
- while(iterator.hasNext()){
- Student stu=iterator.next();
- System.out.println(stu.getSname()+stu.getSex());
- }
返回的结果为一个对象,一般用来根据主键查询
- //1.得到session
- Session session=HibernateSessionFactory.getSession();
- //2。创建查询语句这里的Student为持久化类的,类名
- //String hql="from Student";
- String hql="from Student where sid=201503011 ";
- //3.创建Query对象
- Query query=session.createQuery(hql);
- //4.执行查询 返回结果为Object类型,
- Student student=(Student) query.uniqueResult();
- //5.输出结果
- System.out.println(student.getSname()+student.getSex());
两都的查询机制不同
使用list()时,只需要查询一次就可以完成全部持久化类的,全部字段的查询
使用iterate()时,第一次查询出来的是全部记录的主键ID,然后再去系统缓存中查询相应的记录,如果有这个ID的记录, 将不进行数据库查询,如果没有将进行数据库查询,有多少条记录就要查询1+N次。
返回结果为Object数组,数组的长度为属性的个数
- public static void findByproperty(){
- //1.得到session
- Session session=HibernateSessionFactory.getSession();
- //2。创建查询语句这里的Student为持久化类的,类名
- //String hql="from Student";
- String hql="select sid,sname,sex from Student ";
- //3.创建Query对象
- Query query=session.createQuery(hql);
- //4.执行查询 返回结果为Object类型,
- List list=query.list();
- //5.输出结果
- for (Object object : list) {
- //结果为查询属性数据 的Object对象数组
- Object [] obj=(Object[]) object;
- System.out.println(obj[0]+"\t"+obj[1]+"\t"+obj[2]);
- }
- }
前提是持久化类中要有这个构造方法
返回结果为持久化类的对象集合
- public static void findByCons(){
- //1.得到session
- Session session=HibernateSessionFactory.getSession();
- //2。创建查询语句这里的Student为持久化类的,类名
- //String hql="from Student";
- String hql="select new Student(sid,sname,sex) from Student ";
- //3.创建Query对象
- Query query=session.createQuery(hql);
- //4.执行查询 返回结果为Object类型,
- List<Student> list=query.list();
- //5.输出结果
- for (Student stu : list) {
- System.out.println(stu.getSname()+"\t"+stu.getSex());
- }
- }
这种更直接,明了解,一定要有相应的构造方法
- Session session =new Configuration().configure().buildSessionFactory().openSession();
- Student stu=(Student) session.get(Student.class, 201509009);
- Course cou=(Course) session.get(Course.class, 2222);
- Transaction tran=session.beginTransaction();
- stu.getCourses().add(cou);
- session.update(stu);
- tran.commit();
- session.close();
- Session session =new Configuration().configure().buildSessionFactory().openSession();
- Student stu=(Student) session.get(Student.class, 201509009);
- Course cou=(Course) session.get(Course.class, 2222);
- Transaction tran=session.beginTransaction();
- stu.getCourses().remove(cou);
- session.update(stu);
- tran.commit();
- session.close();
和JDBC中一样使用?来占位
- public static void findCount(){
- Session session=new Configuration().configure().buildSessionFactory().openSession();
- /*String hql="from Emp";
- Query query=session.createQuery(hql);
- List list=query.list();
- int count=list.size();*/
- String hql="select count(*) from Emp";
- Query query=session.createQuery(hql);
- Long count=(Long) query.uniqueResult();
- System.out.println("员工表总记录数:"+count);
- }