本节内容:
- hibernate检索方式说明
- 什么是HQL
- HQL检索方式
- HQL查询的from子句
- HQL查询的select子句
- HQL查询的聚集函数
- HQL查询的where子句
- 绑定参数
- 排序
- 分组函数
- 分页查询
- 对象导航式
- 连接查询
- 本地 SQL 检索方式
1 Hibernate 提供了以下几种检索对象的方式
- l OID检索方式(Object Identifier)
OID对象标始符,按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。
- l HQL检索方式
使用面向对象的HQL查询语言。 Hibernate提供了Query接口,它是Hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句
- l QBC检索方式
使用(Query By Criteria)API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更面向对象的接口。
- l 本地SQL检索方式
使用本地数据库的SQL查询语句。Hibernate会负责把检索到的JDBC ResultSet结果集映射成为对象图。
2 什么是HQL
Hibernate语言查询(Hibernate Query Language,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。它和SQL查询语言有些相似.在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式.它有如下功能:
- l 在查询语句中设定各种查询条件
- l 支持投影查询, 即仅检索出对象的部分属性
- l 支持分页查询
- l 支持连接查询
- l 支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字
- l 提供内置聚集函数, 如 sum(), min() 和 max()
- l 能够调用用户定义的 SQL 函数或标准的 SQL 函数
- l 支持子查询
- l 支持动态绑定参数
3 HQL检索方式包括以下步骤:
- 通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数
- 动态绑定参数
- 调用 Query 的 list() 方法执行查询语句. 该方法返回 java.util.List 类型的查询结果, 在 List 集合中存放了符合查询条件的持久化对象.
HQL和SQL比较:
不同点:
- l HQL 查询语句是面向对象的, Hibernate 负责解析 HQL 查询语句, 然后根据对象-关系映射文件中的映射信息, 把 HQL 查询语句翻译成相应的 SQL 语句. HQL 查询语句中的主体是域模型中的类及类的属性
- l SQL 查询语句是与关系数据库绑定在一起的. SQL 查询语句中的主体是数据库表及表的字段
相似点:
- HQL的语法类似SQL语法
3.1 HQL查询的from子句
From是最简单、最基本的HQL语句。From关键字后紧跟持久化类的类名。
如:from News
标明是检索出所有的学生实体。
推荐使用别名的形式:from News as s 。as关键字是可选的。为了增强可读性,建议保留别名。
案例:查询所有的新闻信息
public void hqlQuery(){ //获取session Session session = HibernateUtil.getSession(); try{ //通过 Session 的 createQuery() 方法创建一个 Query 对象 Query newsq = session.createQuery("from News as s"); //调用 Query对象 的 list()方法执行查询语句 List<News> newsl = newsq.list(); if(newsl!=null){ for(int i=0;i<newsl.size();i++){ News news = newsl.get(i); System.out.println(news.getTitle()); } } }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.closeSession(session); } }
3.2 HQL查询的select子句
select子句用于选择指定的属性或直接选择某个实体,当前整个select选择的属性必须是from后持久化类包含的属性。
案例:查询新闻属性值
public void hqlQuery(){ //获取session Session session = HibernateUtil.getSession(); try{ //通过 Session 的 createQuery() 方法创建一个 Query 对象 Query newsq = session.createQuery("select s.title,s.content from News as s"); //调用 Query对象 的 list()方法执行查询语句 List newsl = newsq.list(); for(Object obj : newsl){ Object[] news = (Object[]) obj; System.out.println(news[0]+"---"+news[1]); } }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.closeSession(session); } }
3.3 HQL查询的聚集函数
HQL支持在选出的属性上,使用聚集函数。HQL支持的聚集函数与SQL的完全相同,有5个:avg ;count;max;min;sum。
案例:查询新闻总数
public void hqlQuery(){ Session session = HibernateUtil.getSession(); try{ Query newsq = session.createQuery("select count(0) from News as s"); String newsl = newsq.uniqueResult().toString(); System.out.println(newsl); }catch(Exception e){ e.printStackTrace(); }finally{ HibernateUtil.closeSession(session); } }
3.4 HQL查询的字符串连接
- l select子句还支持字符串连接符、算术运算符,以及SQL函数
- l select子句也支持使用distinct和all关键字,此时的效果和SQL中的效果完全相同
- l 如:select s.id||“”||s.stuName from Student as s
3.5 HQL查询的where子句
- l where子句用于筛选选中的结果。如: from Student as s where s.stuName like ‘班级1%’
- l 为where子句中的参数赋值,可以绑定参数
- l Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedStatement 的预定义 SQL 语句功能
- l HQL 的参数绑定有两种形式:
- 按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置
- 按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.
案例:检索新闻名字为“title1”的新闻内容信息
//按参数位置: Query newsq = session.createQuery("from News s where s.title=?"); newsq.setString(0, "title1"); List newsl = (List) newsq.list(); for(Object obj : newsl){ News news = (News) obj; System.out.println(news.getContent()); } //按参数名称: Query newsq = session.createQuery("from News s where s.title=:title"); newsq.setString("title", "title1");
3.6 排序和分组函数
- l HQL 采用 ORDER BY 关键字对查询结果排序
如:form Student s order by s.id
- l HQL中可以使用group by和having
如:按照班级进行分组,统计班级人数超过5人的班级名
3.7 分页查询
- l setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
- l setMaxResult(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象
案例:新闻信息顺序排列后,显示第一页记录,每页显示4条记录。
Query newsq = session.createQuery("from News s order by s.id asc"); newsq.setFirstResult(0); newsq.setMaxResults(4); List newsl = (List) newsq.list(); for(Object obj : newsl){ News news = (News) obj; System.out.println(news.getContent()); }
3.8 对象导航式
案例:表间的连接,可以用对象导航式完成(Order和Customer是多对一的映射关系customer是Order对象中关于Customer对象的属性)
Query newsq = session.createQuery("select o.orderNumber,c.custName from Order o join o.customer c order by o.id asc"); List newsl = (List) newsq.list(); for(Object obj : newsl){ Object[] object = (Object[]) obj; System.out.println(object[0]+"------"+object[1]); }
4 本地 SQL 检索方式
- l HQL还支持原生态的SQL
如:Query query = session.createSQLQuery("select * from t_student");
案例:检索所有的新闻信息
Query newsq = session.createSQLQuery("select * from news o order by o.id asc"); List newsl = (List) newsq.list(); for(Object obj : newsl){ Object[] object = (Object[]) obj; System.out.println(object[1]+"---"+object[2]); }
来源:https://www.cnblogs.com/zhouyeqin/p/7196236.html