Hibernate3学习笔记(4)——Hibernate查询技术之HQL语句
来源:互联网 发布:阿狸电视直播软件 编辑:程序博客网 时间:2024/05/23 00:06
1、session中的get( )和load( )方法来查询对象。但其查询功能有限。
private void testGet(){ //1.初始化,读取配置文件hibernate.cfg.xml Configuration config=new Configuration().configure(); //2.读取并解析映射文件(Users.hbm.xml),创建sessionFactory SessionFactory sessionFactory=config.buildSessionFactory(); //3.打开session Session session=sessionFactory.openSession(); //4.加载数据 Users user=(Users)session.get(Users.class, new Integer(1)); //在控制台输出用户名和密码 System.out.println(user.getLoginName()+" "+user.getLoginPwd());}
2、HQL查询方式
使用传统的JDBC API来查询数据,需要编写复杂的SQL语句,然后还要将查询结果以对象的形式进行封装,放到集合对象中保存。这种查询方式麻烦还容易出错。
HQL(Hibernate Query Language)是一种面向对象的查询语言,使用类、对象、和属性的概念,没有表和字段的概念。
HQL查询与JDBC查询相比,具有以下优点:
- 直接针对实体类和属性进行查询,不再编写繁琐的SQL语句;
- 查询结果是直接保存在List中的对象,不要再次封装;
- 可以通过配置dialect属性,对不同的数据库自动生成不同的用于执行的SQL语句。
HQL查询具有以下主要功能:
- 支持属性查询
- 支持参数查询
- 支持关联查询
- 支持分页查询
- 提供内置聚集函数
HQL查询基本步骤:
example 1:
public void testHql_1(){ //获取session Session session=HibernateSessionFactory.getSession(); //编写HQL语句 String hql="from Books"; //创建Query对象 Query query=session.createQuery(hql); //执行查询,获得结果 List list=query.list(); //遍历查找结果 Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
注意:HQL语句from Books中的Books是类名,而不是表名,因此需要区分大小写。关键字from不区分大小写。
session类的find方法及Query接口都支持HQL查询方式。区别在于,find()方法只执行一些简单的HQL查询语句,不具有动态绑定参数的功能,随着hibernate新版本的发行,find()方法将逐步走向淘汰;而Query接口才是真正的HQL查询接口,前面列出的HQL查询功能便是通过该接口提供的。
2.1 属性查询
属性查询也称为投影查询,只查询对象的部分属性,而不是整个对象的数据。
example 2
/** * 属性查询*/ public void testHql_2(){ Session session=HibernateSessionFactory.getSession(); //编写HQL语句,使用属性查询 String hql="select books.title,books.author from Books as books"; Query query=session.createQuery(hql); List list=query.list(); Iterator itor=list.iterator(); //每条记录封装成一个Object数组 while(itor.hasNext()){ Object[] object=(Object[])itor.next(); System.out.println(object[0]+" "+object[1]); } }
上述代码中的HQL语句类似于SQL,但是Books是类名。在HQL语句中也可以有别名,例如,books是Books类的别名,别名可以使用关键字as指定,as关键字也可以省略。
2.2 参数查询
实际应用中,需要根据指定条件进行查询。此时,可以使用HQL语句提供的where子句进行查询,或者使用like关键字进行模糊查询。
参数查询的方式有两种:按参数位置查询和按参数名字查询。
2.2.1 按参数位置查询
按参数位置查询时,在HQL语句中需要使用“?”来定义参数的位置。
example 3
/** * 参数查询,按参数位置查询 */ public void testHql_3(){ Session session=HibernateSessionFactory.getSession(); //编写HQL语句,使用参数查询 String hql="from Books books where books.title like ? "; Query query=session.createQuery(hql); //给HQL语句中“?”代表的参数设置值 query.setString(0, "%C++%"); List list=query.list(); Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
上述代码中,HQL使用“?”来定义参数的位置,这里的hql语句定义了一个参数,第一个参数的位置为‘0’。接下来使用query.setString(0,”%C++%”);方法设置参数的值。setString()方法中,第一个参数表示HQL语句中参数的位置,第二个参数表示HQL语句中参数的值。这里给参数赋值时,使用“%”通配符,匹配任意类型和任意长度的字符串。如果HQL语句有多个参数,可以依次进行赋值。
query还提供了一些给参数赋值的方法:
2.2.2 按参数名字查询
按参数名字查询时,需要在HQL语句中定义命名参数,且命名参数需要以“: ”开头。
example 4
/** * 参数查询,按参数名字查询 */ public void testHql_4(){ Session session=HibernateSessionFactory.getSession(); //通过":bookTitle"定义命名参数"bookTitle" String hql="from Books books where books.title=:bookTitle"; Query query=session.createQuery(hql); //给命名参数设置值 query.setString("bookTitle", "C++ Primer中文版"); List list=query.list(); Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
当然在example 4中也可以用按参数位置查询(?)的方式。
在HQL语句中设定查询条件时,可以使用如下的各种运算。
2.3 连接查询
HQL支持各种连接查询,例如,内连接、外连接和交叉连接等。
下面介绍一种常用的隐式内连接。
example 5
/** * 连接查询 */ public void testHql_5(){ Session session=HibernateSessionFactory.getSession(); //编写HQL语句,使用连接查询 String hql="select b from Books b,Publishers p where b.publishers=p and p.name='清华大学出版社'"; Query query=session.createQuery(hql); List list=query.list(); Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
2.4 分页查询
批量查询时,在单个页面上显示所有的查询结果会存在一定的问题,因此需要对查询结果进行分页显示。query接口提供了用于分页显示查询结果的方法。
(1)setFirstResult(int firstResult):设定从哪个对象开始查询,参数firstResult表示这个对象在查询结果中的索引(索引的起始值为0)。
(2)setMaxResult(int maxResult):设定一次返回多少个对象。默认时,返回查询结果中的所有对象。
example 6-1
/** * 分页查询 */ public void testHql_6(){ Session session=HibernateSessionFactory.getSession(); //按书名升序查询图书对象 String hql="from Books b order by b.title asc"; Query query=session.createQuery(hql); //从第一个对象开始查询 query.setFirstResult(0); //从查询结果中一次返回3个对象 query.setMaxResults(3); //执行查询 List list=query.list(); //遍历查询结果 Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); } }
分页查询是系统中常用的功能,为了方面调用。可以编写以下方法:
example 6-2
public void pagedSearch(int pageIndex,int pageSize){ Session session=HibernateSessionFactory.getSession(); String hql="from Books b order by b.title asc"; Query query=session.createQuery(hql); int startIndex=(pageIndex-1)*pageSize; query.setFirstResult(startIndex); query.setMaxResults(pageSize); List list=query.list(); Iterator itor=list.iterator(); while(itor.hasNext()){ Books book=(Books)itor.next(); System.out.println(book.getTitle()+" "+book.getAuthor()+" "+book.getContentDescription()); }}
2.5 聚集函数
在HQL语句中可以使用的聚集函数包括:
example 7
/** * 聚集函数 */ public void testHql_7(){ Session session=HibernateSessionFactory.getSession(); //统计记录总数 String hql1="select count(b) from Books b"; Query query1=session.createQuery(hql1); Long count=(Long)query1.uniqueResult(); //统计书的平均金额 String hql2="select avg(b.unitPrice) from Books b"; Query query2=session.createQuery(hql2); Double money=(Double)query2.uniqueResult(); //统计最贵和最便宜的图书 String hql3="select min(b.unitPrice),max(b.unitPrice) from Books b"; Query query3=session.createQuery(hql3); Object[] price=(Object[])query3.uniqueResult(); System.out.println("记录总数"+count.toString()+" 平均金额"+ money.toString()+" 书价最低为"+price[0].toString()+ " 书价最高为"+price[1].toString()); }
3、Criteria查询
Criteria查询又称为对象查询,它使用一种封装了基于字符串形式的查询语句的API来查询对象。
- Hibernate3学习笔记(4)——Hibernate查询技术之HQL语句
- Hibernate3学习笔记(5)——Hibernate查询技术之Criteria查询
- Hibernate3学习笔记(6)——Hibernate查询技术之DetachedCriteria查询
- Hibernate查询技术之HQL语句
- Java学习笔记之Hibernate-单表hql查询语句
- hibernate学习笔记——hql查询
- Hibernate学习笔记(十) — HQL查询
- Hibernate3学习笔记(9)—— HQL实现查询对象部分属性
- Hibernate之hql语句查询
- hibernate 中HQL语句查询学习笔记一
- hibernate 中HQL语句查询学习笔记一
- J2EE学习笔记——Hibernate HQL查询
- hql查询语句(hibernate)
- hibernate学习之六——HQL查询
- Hibernate学习之HQL查询
- Hibernate—(HQL查询)
- hibernate 中HQL语句查询学习
- hibernate 中HQL语句查询学习
- poj3258解题报告
- VS调试无法进入DLL中断点解决方法
- 《计算机的心智:操作系统之哲学原理》 邹恒明(这本书写的不错, 非计算机专业的朋友可以读读, 补补操作系统知识和原理)
- 如何使用Hadoop的JobControl
- SGU134 Centroid
- Hibernate3学习笔记(4)——Hibernate查询技术之HQL语句
- Find Peak Element
- hdu 1054 Strategic Game 【匈牙利算法】
- [leetcode] Invert Binary Tree
- JQuery
- Altium Designer 6.9报错:Unknow Pin的解决方法
- JS 事件学习笔记(一)
- div边框弧形设计,radius的用法,CSS3 border-radius 属性
- android websocket client 如何调用autobahn.jar