zoukankan      html  css  js  c++  java
  • 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.得到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子句

    也可以支持where子句

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

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

    例如:

    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的方法

    5.1、list()方法

    //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());
            }

    5.2、iterate()方法

    //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());
            }
            

    5.3、uniqueResult()方法

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

    //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());

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

    两都的查询机制不同

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

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

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

    6.1、直接指定属性查询

    返回结果为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]+"	"+obj[1]+"	"+obj[2]);
            }
            
        }

    6.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()+"	"+stu.getSex());
            }
            
        }

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

     七、实体更新和删除

    7.1、更新

        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();
    View Code

    7.2、删除

    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();
    View Code

    八、参数绑定

    8.1占位符、

    和JDBC中一样使用?来占位

    8.2、命名参数

    九、排序

    十、统计函数

        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);
            
        }
        
    View Code

     

  • 相关阅读:
    mac下如何全量删除短信内容
    git log --oneline --graph的读法
    nginx bind() to 0.0.0.0:**** failed (13: Permission denied)
    nginx安装和配置
    pycharm的插件pylint报错:java.lang.Throwable: Write-unsafe context! Model changes are allowed from write-safe contexts only. Please ensure you're using invokeLater/invokeAndWait with a correct modality stat
    python编码规范、js编码规范及IDE的检查插件pylint/eslint等
    Flask 在 Debug 模式下初始化2次
    python的globals()使用
    删除整张表数据但是空间没有减少
    DBCC DBREINDEX重建索引提高SQL Server性能
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4337616.html
Copyright © 2011-2022 走看看