第五章 HQL实用技术

时间:2022-04-08 18:18:39

第五章   HQL实用技术
5.1  使用HQL查询语句(面向对象查询语句)
    5.1.1 编写HQL语句
        5.1.1.1 from子句
                    例:from com.entity.Dept;
                    from Dept dept;--为持久化类Dept指定了别名dept;可省略包名
        5.1.1.2    select子句
                    例:select dept from Dept as dept;
                    select dept.DeptName from Dept as dept;--选取单个属性,可选择多个
        5.1.1.3 where子句
                    例:from Dept where DeptName='SALES';
                    from Dept dept where dept.DeptName='SALES';
                    from Dept dept where dept.location is not null;--查询地址不为空的部门
        5.1.1.4    表达式
                    例:from Dept dept where lower(dept.DeptName)='sales';--lower()把字符串中的字母转换成小写
                    from Emp where year(hireDate)=1980;--year()用于获取日期字段的年份
        5.1.1.5    order by子句
                    例:from Emp order by hireDate asc
                    from Emp order by hireDate,salary desc;
    5.1. 执行HQL语句
        5.1.2.1 声明变量并初始化
                String hql = "from Emp";
                构建Query对象
                Query query = session.createQuery(hql);
                两种执行方式
                    1、使用list()方法执行查询
                    2、使用iterator()方法执行查询
                执行HQL语句步骤
                    1、获取session对象
                    2、编写HQL语句
                    3、创建Query对象
                    4、执行查询
5.2 在HQL查询语句中绑定数据
    5.2.1 参数绑定形式
        5.2.1.1 按参数位置绑定
            例:Query query = session.createQuery("from Emp where job=? and salary>?");
                query.setString(0,job);--第一个参数位置为零
                query.setDouble(1,salary);
        5.2.1.2 按参数名称绑定
            例:Query query = session.createQuery("from Emp where job=:empJob and salary>:empSalary");
                query.setString("empJob",empJob);
                query.setDouble("empSalary",empSalary);
        名称绑定和位置绑定:
                1、使程序代码有较好的可读性
                2、按名称绑定的形式有利于程序代码的维护,
    5.2.2 绑定各种类型的参数
            setBoolean():绑定类型为Boolean的参数
            setByte():绑定类型为Byte的参数
            setDouble():绑定类型为Double的参数
            setDate():绑定类型为Date的参数
            setString():绑定类型为String的参数
            以上方法都有两种重载方式 如:
                setString(int position,String val);--按位置绑定参数
                setString(String name,String val);--按名称绑定参数
        5.2.2.1    setParameter()方法:绑定任意类型参数
            例:Query query = session.createQuery("from Emp where job=:empJob and salary>:empSalary");
                query.setParameter("empJob",empJob);
                query.setParameter("empSalary",empSalary);
        5.2.2.2 setProperties()方法:绑定命名参数与一个对象的属性值
            例: Dept depts=new Dept();
                 depts.setName("sales");
                 String hql="from Dept as dept where dept.deptName=:name";
                 Query query=session.createQuery(hql);
                 query.setProperties(depts);
                 List result=query.list();
    5.2.3 使用uniqueResult()方法获取唯一结果
            当查询结果不唯一时,不能使用query.uniqueResult()方法,否则会报错
5.3 分页和投影
    5.3.1 实现数据分页查询
          使用Query接口的setFirstResult(int firstResult)和setMaxResults(int maxResults)
          setFirstResult(int firstResult):用与设置第一条记录的位置
          setMaxResults(int maxResults):用于设置最大返回的记录条数
         具体步骤:
            1、使用聚合函数count()获取总记录数count;
            2、计算总页数
                int totalpages=(count% pageSize==0)?(count/pageSize):(count/pageSize+1);--pageSize保存每页显示的记录数
            3、实现分页
                query.setFirstResult((pageIndex-1)*pageSize);--pageIndex为当前页码
                query.setMaxResults(pageSize);
                List result=query.list();--得到分页查询的结果
    5.3.2 使用投影查询
            1)将每条查询结果封装成Object对象
            2)将每条查询结果封装成Object数组
            3)将每条查询结果通过构造函数封装成对象
5.4 使用MyEclipse反向工具
    1、新建工程后,添加Hibernate支持
    2、选择Hibernate3.3版本
    3、创建Hibernate配置文件
    4、配置数据库连接信息
    5、生成持久化类和映射文件
    6、进入数据库窗口
    7、选择右键菜单Hibernate Reverse Engineering
    8、选择主键生成器