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反向工程工具

posted on 2018-06-25 18:25  不可抗力  阅读(209)  评论(0编辑  收藏  举报

导航