Hibernate学习笔记(九) — Hibernate的查询

Hibernate共提供以下三种检索方式

HQL检索方式:

1.通过 Session 的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名参数

2.动态绑定参数

3.调用 Query 的 list() 方法执行查询语句. 该方法返回java.util.List 类型的集合, 在 List 集合中存放了符合查询条件的持久化对象.

4.Qurey 接口支持方法链编程风格, 它的 setXxx() 方法返回自身实例

Hibernate 的参数绑定机制依赖于JDBC中的 PreparedStatement 的预定义 SQL 语句功能.

两种形式:

按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.(hibernate特有)

Query query = session.createQuery("from Classes where name=:name1");
		query.setParameter("name1", "asdj");

按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置

Query query = session.createQuery("from Classes as c where c.name=?");
query.setParameter(0, "asdj");//别名as,可省略

HQL采用ORDER BY关键字对查询结果排序

Query query = session.createQuery("from Classes as c order by c.id");
		List<Classes> classes = query.list();

分页查询

setFirstResult(intfirstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索

setMaxResult(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象

List<Classes> classes = query.setFirstResult(1).setMaxResults(5).list();

投影查询:

查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.

Query的list()方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条记录

可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录

可以通过
DISTINCT 关键字来保证查询结果不会返回重复元素

from Customer c join c.orders o where o.orderNumber like ‘X%’
如果希望查询结果中只包含Customer对象,可使用以下形式
select c from Customer c join c.orders o where o.orderNumber like X%’
Select关键字还能用于选择对象的部分属性
session.createQuery("select c.id,c.name,o.orderNumber from Customer
				c join c.orders o where o.orderNumber like 'X%'")
其对应的sql语句为
select c.id,c.name,o.ORDER_NUMBER from CUSTOMERS c inner join
ORDERS o on c.ID = o.CUSTOMER_ID where o.ORDER_NUMBER like 'X%'
通过 DISTINCT 过滤重复元素
createQuery("select distinct c.name from customer c");
Query query = session.createQuery("select
                   " new cn.abc.Customer(c.id,c.name,o.orderNumber) " +
                   " from Customer c  join c.orders o  where o.orderNumber like  '%X%'");
List list = query.list(); 

分组

HQL利用GROUP BY 关键字对数据分组,用HAVING 关键字对分组数据设定约束条件.

List list=session.createQuery("select c.name,count(c)
                         from Customer c group by c.name").list();
System.out.println(list.size());

聚合函数

Query query = session.createQuery("select count(*) from Customer c");
Integer count=(Integer)query.uniqueResult();
System.out.println("count "+count);

Query query = session.createQuery("select avg(c.age) from Customer c");
Float avg=(Float)query.uniqueResult();
System.out.println("avg "+avg);

Query query = session.createQuery("select max(c.age),min(c.age) from  Customer c");
Object[] objs=(Object[])query.uniqueResult();
System.out.println("max "+(Long)objs[0]);
System.out.println("min "+(Long)objs[1]);

Query query = session.createQuery("select sum(c.age) from Customer c");
Long sum=(Long)query.uniqueResult();
System.out.println("sum "+sum);

QBC 检索方式


短语


含义


Restrictions.eq


等于=


Restrictions.allEq


使用Map,使用key/value进行多个等于的判断


Restrictions.gt


大于>


Restrictions.ge


大于等于>=


Restrictions.lt


小于<


Restrictions.le


小于等于<=


Restrictions.between


对应sql的between子句


Restrictions.like


对应sql的like子句


Restrictions.in


对应sql的in子句


Restrictions.and


and 关系


Restrictions.or


or关系


Restrictions.sqlRestriction


Sql限定查询

Criteria criteria=session.createCriteria(Customer.class);
       //设定查询条件,每个Criterion实例代表一个查询条件
Criterion cn1=Restrictions.eq("name", "tom1");
criteria.add(cn1);
list=criteria.list();

应用的时候从帮助文档看看例子即可

本地SQL的查询方式

query = session.createSQLQuery(本地sql语句);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-21 02:17:25

Hibernate学习笔记(九) — Hibernate的查询的相关文章

《Hibernate学习笔记九》:多对一和一对多的关联关系

<Hibernate学习笔记九>:多对一和一对多的关联关系 前面介绍了一对一的关联关系在Hibernate应该如何来实现,这篇博文就来介绍下多对一和一对多的关联关系. 多对一和一对多的关联关系在我们的生活中也比较常见,例如,在我们学生时代,一个班级可以有多个学生,而一个学生只能属于一个班级,这就是一个多对一(一对多)的例子: 还有在我们的工作中,一个工作小组可以有多个用户,而一个用户只能属于一个小组,这也是一个多对一(一对多)的关系的例子. 1.多对一的单向关联关系 下面就以一个工作小组可以有

Hibernate学习笔记(2)Hibernate问题

(1)数据库驱动问题 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Exception in thread "main" org.hibernate.HibernateException: JDBC Driver class not found: com.m

Hibernate学习笔记(一) — hibernate的配置文件简介与执行原理

一.初识Hibernate 1.JDBC的缺点: 1).编写代码的时候过于繁琐,try和catch比较多2).没有做数据缓存 3).不是面向对象编程 4).sql语句固定,可移植性差 JDBC的优点:效率比较高 2.Hibernate优点 1).完全面向对象编程 2).hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存3).跨平台性强 4).使用场合多应用于企业内部的系统 Hibernate缺点 1).效率低 2).表中的数据如果在千万级别,则hibernate不适合 3).如果表与表

Hibernate学习笔记(六) — Hibernate的二级缓存

我们知道hibernate的一级缓存是将数据缓存到了session中从而减少与数据库的交互.那么二级缓存呢? 一.应用场合 比如,在12306购票时,需要选择出发地与目的地,如果每点一次都与数据库交互一次,这就很不合适,这些地点数据在相当长的一段时间内是不会发生变化的(山东省在相当长的时间内还叫山东省),所以应该缓存起来,没必要每次都与数据库交互,而且该类数据安全性也不是很高. 适合二级缓存的数据: 在现代软件开发中,确实存在一类数据没有什么私有性,为公开的数据,数据基本上不发生变化,该数据保密

Hibernate学习笔记(三) — Hibernate 的一级缓存意义

什么是缓存? 缓存说白了,就是应用程序向数据库要数据,然后把一些数据,临时的放在了内存的区域中,第二次再要数据的时候,直接从内存中拿即可. 缓存需要解决的事情: 1.能把数据放入缓存 2.能把数据从缓存中取出来 3.如果缓存中的数据发生变化,需要把数据同步到数据库中 4.把数据库中的数据同步到缓存中 5.hits命中率低的对象应该及时从缓存中移走 分布式缓存: 为什么会有分布式缓存? 应用程序运行在服务器上,并发访问时,服务器压力过大,分布式缓存就是来分担服务器压力的. 分布式缓存之间的数据是同

hibernate学习笔记之一 hibernate简介

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架 hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

Hibernate学习笔记(3)

两年前曾经学习过Hibernate,也通过博客将Hibernate的学习过程记录下来了,地址如下: Hibernate学习笔记(1) Hibernate学习笔记(2) 最近在复习Hibernate,在重新学习的过程中,有了一些新的体会和收获,现在将其总结成博客,供以后作为参考资料使用. 一.导入相应的jar包 目前Hibernate更新到了4.x版本,在官网下载后,找到lib文件加中的required文件夹,此外还需要额外导入log4j和数据库驱动包. 二.创建Hibernate配置文件 在sr

Hibernate学习笔记:第一个程序的搭建

Hibernate学习笔记:第一个程序的搭建 前一段时间对Struts2这个框架有了一点点地了解,很高兴,自己开始学习Hibernate这个框架了.本篇博文将记录下第一个Hibernate程序的搭建过程.其实有时候个人觉得无论我们学习什么语言也好,还是学习什么框架也好,第一个HelloWorld程序真的相当重要,假如 我们在学习第一个HelloWorld程序都跑不出来,这完全影响着我们对新接触的东西的兴趣和动力,但是,往往第一个程序都会涉及到很多的配置,因此使得对于初学者要摸索一定的时间,对于我

hibernate学习笔记之三(一级缓存的使用和管理)

(hibernate学习笔记系列来自于 "疯狂Java" Hibernate视频学习) 一级缓存 一级缓存生命周期很短,与session生命周期一致,所以一级缓存也叫session级缓存或事务级缓存.位于缓存中的对象处于持久化状态,它与表中的相关记录对应,session能够在某些时间点,按照缓存中持久化对象的属性来同步数据库中表的记录,这一过程称为清理缓存. 一级缓存实现原理. session缓存是由它的实现类sessionImpl中定义的一些集合属性构成的,原理是保证有一个引用在关联