• HQL实用技术(有待整改)


    一、使用HQL查询语句

    HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念。HQL查询在形式上和SQL查询相似。但HQL是完全面向对象的,它可以理解继承、多态和关联之类的概念。

    1,编写HQL语句

    HQL语句中除了java类和属性的名称外,查询语句对大小写不敏感,所以SELect和select是相同的,但是cn.dzqc.hidematdemo.entity.Dept不等价于cn.dzqc.hidernatdemo.e

    (1)from子句

    Hibernate 中最简单的HQL语句形式如下,

    • from cn.dzqc.hibernatedemo.entity.dept

    说明:cn.dzqc.hibernatedemo.entity.dept是全限定类名(绝对路径)

    • from dept

    说明:类名dept省略了包名

    • from dept as dt
    • from dept dt

    说明:这条HQL语句持久化类dept指派了别名dt,可以在HQL语句中使用这个别名。as关键字是可选的。

    (2)select 子句

    (3)

    (4)

    (5)

    2.执行HQL语句

    HQL语句准备好以后,使用如下语句构建Query对象:

    //声明变量并初始化

    String hql="from dept";

    //构建Query对象

    Query query=session.createQuery(hql);

    Query对象构件好以后,执行查询语句,并获取查询结果。有两种方式执行查询,一种是Query对象的list()方法,一种是它的iterator()方法。

    (1)使用list()方法执行查询,并输出结果

    代码示例:

    //使用list()查询
        public void list(){
        try {
            conf=new Configuration().configure();
            sf=conf.buildSessionFactory();
            sess=sf.openSession();
            //声明变量并且初始化
            String hql="from dept";
            Query query=sess.createQuery(hql);
            //查询
            List<dept>deptlist=query.list();
            //for循环输出
            for (dept dept : deptlist) {
                System.out.println("员工姓名:"+dept.getDname());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }finally{
            sess.close();
        }
        }

    (2)使用iterator()方法执行查询,并输出结果

    代码示例:

    //使用iterator()方法执行查询
        public void iterator(){
            try {
                conf=new Configuration().configure();
                sf=conf.buildSessionFactory();
                sess=sf.openSession();
                //声明变量并且初始化
                String hql="from dept";
                Query query=sess.createQuery(hql);
                //查询
                Iterator<dept> deptIterator=query.iterate();
                dept dt=null;
                while (deptIterator.hasNext()) {
                    dt=deptIterator.next();
                    System.out.println("员工姓名:"+dt.getDname());
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally{
                sess.close();
            }
        }

    list()方法和iterator()方法的区别:

    list()方法生成一条SQL语句查询所有符合条件的记录(select*from dept)

    iterator()方法首先查询出所有符合条件的主键值,然后在需要某一对象的其他属性值时,才生成按主键查询的SQL语句(select*from dept where deptno=?)

     执行HQL语句的步骤:

    (1)获取Session对象

    (2)编写HQL语句

    (3)创建Query对象

    (4)执行查询,得到查询结果

    二、在HQL查询语句中绑定参数

    1,参数绑定形式

    (1)按参数位置绑定

    在HQL查询语句中用“?”占位符来定义参数的位置,形式如下:

    Query query=session。createQuery(“from dept where deptno=?”)

    以上HQL查询语句定了一个参数,调用setXXX()方法来绑定参数,如果有多个参数,第一位为零。。。。

    query.setString(0,depno);

    如果参数为字符串类型,可以调用setString()方法,如果参数为整型,可以调用setInteger(),以此类推。这些setXXXX()方法的第一个参数代表HQL查询语句中的参数位置。

    代码示例(按照编号区间查找姓名):

    //按参数位置绑定
        public void loc(int num){
            try {
                conf=new Configuration().configure();
                sf=conf.buildSessionFactory();
                sess=sf.openSession();
                //声明变量并且初始化
                String hql="from dept where deptno>? and deptno<?";
                Query query=sess.createQuery(hql);
                //为占位符赋值
                query.setDouble(0, num);
                query.setDouble(1, 30);
                Iterator<dept> deptIterator=query.iterate();
                while (deptIterator.hasNext()) {
                    dt=deptIterator.next();
                    System.out.println("员工姓名:"+dt.getDname());    
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally{
                sess.close();
            }
            
        }

    (2)按参数名称绑定

    在HQL查询语句中定义命名参数,命名参数以“:”开头,形式如下:

    Query query=session。createQuery(“from dept where deptno=:deptno”)

    以上HQL查询语句定了一个参数,调用setXXX()方法来绑定参数:

    query.setDouble("deptno",deptno);

    如果参数为字符串类型,可以调用setString()方法,如果参数为整型,可以调用setInteger(),以此类推。这些setXXXX()方法的第一个参数代表命名参数的名称,第二个参数表示命名参数的值。

    代码示例(按照编号查找姓名):

    //按照参数名称
        public void name(int no){
            try {
                conf=new Configuration().configure();
                sf=conf.buildSessionFactory();
                sess=sf.openSession();
                //声明变量并且初始化
                String hql="from dept as dt where dt.deptno=:num";
                Query query=sess.createQuery(hql);
                //为占位符赋值
                query.setDouble("num", no);
                Iterator<dept> deptIterator=query.iterate();
                while (deptIterator.hasNext()) {
                    dt=deptIterator.next();
                    System.out.println("员工姓名:"+dt.getDname());
                    
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally{
                sess.close();
            }
            
        }

    其中我用到的是带参的方法。

    位置绑定和名称绑定的

    2,绑定各种类型的参数

    3,实现动态查询

    4,使用uniqueResult()方法获取唯一结果

    三、分页和投影

    1,实现数据分页查询

    2,使用投影查询

    四、使用MyEclipse反向工程工具

  • 相关阅读:
    压测场景下的 TIME_WAIT 处理
    拥抱云原生,Fluid结合JindoFS :阿里云OSS加速利器
    从DHTML、HTC、XHTML到AJAX
    altas(ajax)控件(一):多功能面板控件Accordion
    fedora7 常用软件安装
    Fedora7安装后的配置
    .net程序员的盲点(六):StringBuilder 和 String 的区别
    .net程序员的盲点(五):告诉你一个不一样的new
    .net程序员的盲点(四):索引器Indexers
    员工究竟渴望学到的是什么?-(杂谈-20070816)
  • 原文地址:https://www.cnblogs.com/3sanrenyou/p/8668861.html
Copyright © 2020-2023  润新知