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