Hibernate -- 检索方式 HQL
Hibernate 提供了以下几种检索对象的方式
导航对象图检索方式:
根据已经加载的对象导航到其他对象
OID 检索方式: 按照对象的OID
来检索对象
HQL 检索方式:使用面向对象的HQL查询语言
QBC 检索方式:使用QBC(Query By Criteria) API来检索对象.这种API
封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口.
本地 SQL 检索方式:使用本地数据库的SQL
查询语句
对象,它包括一个HQL
查询语句. HQL查询语句中可以包含命名参数
方法执行查询语句.该方法返回java.util.List类型的查询结果,在List
集合中存放了符合查询条件的持久化对象.
方法返回自身实例,而不是void
类型
查询语句,然后根据对象-关系映射文件中的映射信息,把HQL
查询语句翻译成相应的SQL语句. HQL查询语句中的主体是域模型中的类及类的属性
的参数绑定机制依赖于 JDBC API
中的 PreparedStatement
的预定义 SQL 语句功能.
查询语句中定义命名参数,命名参数以 “:”开头.
查询语句中用 “?”来定义参数位置
把参数与一个持久化类绑定
绑定任意类型的参数. 该方法的第三个参数显式指定Hibernate映射类型
知识点4: 多态查询(是指查询出当前类及所有子类的实例)
知识点6: 分页查询
setFirstResult(int firstResult): 设定从哪一个对象开始检索,参数
firstResult 表示这个对象在查询结果中的索引位置,
索引位置的起始值为 0.
默认情况下, Query从查询结果中的第一个对象开始检索
setMaxResult(int maxResults): 设定一次最多检索出的对象的数目.在默认情况下, Query
和 Criteria
接口检索出查询结果中所有的对象
知识点10: 迫切左外连接
//left outer join fetch
表示迫切左外连接检索策略
//Query方法返回的集合中存放Customer对象的引用,每个Customer对象的orders集合都被初始化
知识点11: 左外连接
//left outer join 左外连接,使用左外连接查询时,将根据映射文件的配置来决定
// orders集合的检索策略
返回是对象数组
知识点12: 内连接
HQL查询:默认检索的是成对的对象Customer和Order。返回是对象数组
知识点13: 迫切内连接
//Inner join fetch表示迫切内连接检索策略,也就是覆盖映射文件中指定的检索策略
知识点15: 右连接
HQL: right outer join 右外连接 返回是对象数组
知识点17:投影查询
SELECT 关键字实现.
from Customer c join c.orders o where o.orderNumber like ‘T%’
如果希望查询结果中只包含Customer对象,可使用以下形式:
select c from Customer c join c.orders o where o.orderNumber like T%’
---------------------------------------------------------------------------------
Select关键字还能用于选择对象的部分属性
session.createQuery(“select c.id,c.name,o.orderNumber from Customer
c join c.orders o where o.orderNumber like ‘T%’”)
对应的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’T%’
------------------------------------------------------------------------------------
过滤重复元素
createQuery(“select distinct c.name from customer c”);
Query query = session.createQuery("select
" new cn.itcast.one2manySearch.CustomerRow(c.id,c.name,o.orderNumber) " +
" from Customer c join c.orders o where o.orderNumber like '%NO1%'");
知识点18:报表查询
与 SQL 一样, HQL利用
GROUP BY关键字对数据分组,用
HAVING关键字对分组数据设定约束条件.
•min()
•max()•sum()
•avg()
使用聚集函数
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[] maxmin=(Object[])query.uniqueResult();
// System.out.println("max "+(Long)maxmin[0]);
// System.out.println("min "+(Long)maxmin[1]);
/***********************************************************/
//Query query = session.createQuery("select sum(c.age) from Customer c");
// Long sum=(Long)query.uniqueResult();
// System.out.println("sum "+sum); //分组
List list=session.createQuery("select c.name,count(c)
from Customer c group by c.name").list();
System.out.println(list.size());
示例代码:
public class AppFind {
private static SessionFactory sf = null;
static {
Configuration config = new Configuration();
config.configure("cn/itcast/search/hibernate.cfg.xml");
config.addClass(Customer.class);
config.addClass(Order.class);
sf = config.buildSessionFactory();
}
@SuppressWarnings({ "unused", "unchecked" })
@Test
public void Search(){
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
/********************************************************************************************************/
//知识点1: 简单的查询
//使用hql查询 query hql查询接口
// Query query=session.createQuery("from Customer c where c.name='tom'");
// List<Customer> list=query.list();
// //使用qbc Criteria标注化查询接口
// Criteria cr=session.createCriteria(Customer.class);
//
// //每个Criterion对象表示一个查询条件
// Criterion cn=Restrictions.eq("name", "tom");
//
// //增加条件
// cr.add(cn);
// List<Customer> list=cr.list();
/********************************************************************************************************/
//知识点4: 多态查询(是指查询出当前类及所有子类的实例)
// Query query=session.createQuery("from Customer c ");
// query.list();
// Query query=session.createQuery("from java.io.Serializable o");
// query.list();
// Query query=session.createQuery("from java.lang.Object o");
// query.list();
/********************************************************************************************************/
//知识点5: 对查询结果排序
// Query query=session.createQuery("from Customer c order by c.id desc");
// query.list();
//使用qbc Criteria标注化查询接口
// Criteria cr=session.createCriteria(Customer.class);
// cr.addOrder(org.hibernate.criterion.Order.desc("id"));
// cr.list();
/********************************************************************************************************/
//知识点6: 分页查询
//使用hql
// Query query=session.createQuery("from Order o order by o.id desc");
// query.setFirstResult(0);
// query.setMaxResults(10);
// query.list();
//
//使用qbc
// Criteria cr=session.createCriteria(Order.class);
// cr.addOrder(org.hibernate.criterion.Order.desc("id"));
// cr.setFirstResult(0);
// cr.setMaxResults(10);
// cr.list();
/********************************************************************************************************/
//知识点7: 检索单个对象
//使用hql
// Query query=session.createQuery("from Customer c where c.name='tom'");
// query.setMaxResults(1);
// query.uniqueResult();
//使用qbc
// Criteria cr=session.createCriteria(Customer.class);
// Criterion cn=Restrictions.eq("name", "tom");
// cr.add(cn);
// cr.setMaxResults(1);
// cr.uniqueResult();
/********************************************************************************************************/
//知识点8_1: 绑定参数的形式,按参数名称绑定
//:cname :cage表示参数的名称
// Query query=session.createQuery("from Customer c where c.name=:cname and c.age=:cage");
// //第一个参数代表名字,第二个参数代表值
// query.setString("cname", "tom");
// query.setInteger("cage", 32);
// query.list();
/********************************************************************************************************/
//知识点8_2: 绑定参数的形式,按参数位置绑定
// Query query=session.createQuery("from Customer c where c.name=? and c.age=?");
// //第一个参数代表名字,第二个参数代表值
// query.setString(0, "tom");
// query.setInteger(1, 32);
// query.list();
/********************************************************************************************************/
//知识点9: 在映射文件中定义命名查询语句
/*
* <query name="fingCustomerByName">
<![CDATA[from Customer c where c.name like ?]]>
</query>
*/
// Query query=session.getNamedQuery("fingCustomerByName");
// query.setString(0, "%t%");
// query.list();
//
/********************************************************************************************************/
//知识点10: 迫切左外连接 //left outer join fetch 表示迫切左外连接检索策略
//返回的list集合存放的Customer对象,而Customer对象同时有关联到订单集合
//hql的语法会覆盖映射文件中
// Query query=session.createQuery("from Customer c left outer join fetch c.orderes where c.name like ?");
// query.setString(0, "%tom%");
// List<Customer> list=query.list();
// for(int i=0;i<list.size();i++){
// Customer c=list.get(i);
// System.out.println(c.getId()+" "+c.getName()+"****************************************");
//
// Set orderes=c.getOrderes();
// Iterator<Order> it=orderes.iterator();
// while(it.hasNext()){
// Order o=it.next();
// System.out.println(o.getId()+" "+o.getOrderNumber());
//
// }
// }
/********************************************************************************************************/
//知识点11: 左外连接 //left outer join 左外连接,使用左外连接查询时,
//将根据映射文件的配置来决定orders集合的检索策略
//返回是对象数组,对象数组的长度是2,对象数组中放置的是customer和order对象
// Query query=session.createQuery("from Customer c left outer join c.orderes where c.name like ?");
// query.setString(0, "%tom%");
// List list=query.list();
// for(int i=0;i<list.size();i++){
// Object[] pair=(Object[])list.get(i);
// Customer c=(Customer)pair[0];
// Order o=(Order)pair[1];
// System.out.println(c.getId()+" "+c.getName()+"* "+o.getId()+" "+o.getOrderNumber());
// }
/********************************************************************************************************/
//知识点12: 内连接
// Query query=session.createQuery("from Customer c join c.orderes where c.name like ?");
// query.setString(0, "%tom%");
// List list=query.list();
/********************************************************************************************************/
//知识点13: 迫切内连接
// Query query=session.createQuery("from Customer c inner join fetch c.orderes where c.name like ?");
// query.setString(0, "%tom%");
// List list=query.list();
/********************************************************************************************************/
//知识点15: 右连接
// Query query=session.createQuery("from Customer c right outer join c.orderes where c.name like ?");
// query.setString(0, "%tom%");
// List list=query.list();
/********************************************************************************************************/
//知识点17:投影查询(查询实体的部分属性),返回值是一个对象数组,数组中存放的查询的属性值s
// Query query=session.createQuery("select c.name, o.orderNumber,o.price from Customer c inner join c.orderes o where c.name like ?");
// query.setString(0, "%tom%");
// List list=query.list();
/********************************************************************************************************/
//使用构造函数封装查询的信息
// Query query=session.createQuery("select new cn.itcast.search.CustomerRow(c.name, o.orderNumber,o.price) from Customer c inner join c.orderes o where c.name like ?");
// query.setString(0, "%tom%");
// List list=query.list();
/********************************************************************************************************/
// 知识点18:报表查询 查询有多少客户
// Query query=session.createQuery("select count(o) from Customer o");
// Long count=(Long)query.uniqueResult();
//知识点18:报表查询 分组
Query query=session.createQuery("select o.name,count(*) from Customer o group by o.name");
query.list();
/********************************************************************************************************/
tx.commit();
session.close();
}
}
Hibernate -- 检索方式 HQL的更多相关文章
- Hibernate 检索方式
概述 •Hibernate 提供了以下几种检索对象的方式 –导航对象图检索方式: 根据已经加载的对象导航到其他对象 –OID 检索方式: 按照对象的 OID 来检索对象 –HQL 检索方式: 使用 ...
- Hibernate入门6.Hibernate检索方式
Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...
- Hibernate检索方式 分类: SSH框架 2015-07-10 22:10 4人阅读 评论(0) 收藏
我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位.那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为Hi ...
- Hibernate检索方式(转载)
我们在项目应用中对数据进行最多的操作就是查询,数据的查询在所有ORM框架中也占有极其重要的地位. 那么,如何利用Hibernate查询数据呢?Hibernate为我们提供了多种数据查询的方式,又称为H ...
- (转) Hibernate检索方式概述
http://blog.csdn.net/yerenyuan_pku/article/details/70554816 Hibernate检索方式概述 我们在对数据库的操作中,最常用的是select, ...
- hibernate检索方式(HQL 检索方式,QBC 检索方式,本地 SQL 检索方式)
hibernate有五种检索方式,这儿用 单向的一对多的映射关系 例子,这儿有后三种的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 ...
- [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate 检索方式之 HQL 检索方式
HQL(Hibernate Query Language) 是面向对象的查询语言,它和 SQL 查询语言有些相似.在 Hibernate 提供的各种检索方式中,HQL 是使用最广的一种检索方式,它有如 ...
- Hibernate 查询方式(HQL/QBC/QBE)汇总
作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...
随机推荐
- win7(iis7)无法加载运行CSS文件的解决方法
在打开或关闭window功能中的Internet信息服务里的万维网服务=>常见HTTP功能=>静态内容 ,将其选上 即可了,如下图
- transaction 数据库事务 roolback 回滚
事务是恢复和并发控制的基本单位 https://baike.baidu.com/item/数据库事务/9744607 事务有三种模型: 1.隐式事务是指每一条数据操作语句都自动地成为一个事务,事务的开 ...
- 编译安装cmake3
编译安装cmake3 ubuntu 14 的系统默认安装的是cmake2.7,apt-get upgrade之后也还是cmake2.7,而很多软件如今需要3及以上的版本来进行cmake编译(如caff ...
- windows下使用IIS创建git服务
Bonobo Git Server 下载地址: https://bonobogitserver.com/ 安装方法:https://bonobogitserver.com/install/ 配置简单, ...
- 洛谷 P2216 [HAOI2007]理想正方形
洛谷 巨说这是一道单调队列好题,但是我并不是用单调队列做的诶. 如果往最暴力的方向去想,肯定是\(n^3\)的\(dp\)了. \(f[i][j][k]\)代表当前正方形的左上角定点是\((i,j)\ ...
- 转载一篇pandas和,mysql
http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html#compare-with-sql-join http://bl ...
- java内存相关
(类是对象的抽象,而对象是类的具体实例.类是抽象的,不占用内存,而对象是具体的,占用存储空间.) 1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内 ...
- Spring的IoC模式
1.依赖 依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它.下面看一个 ...
- PAT 1095 Cars on Campus
1095 Cars on Campus (30 分) Zhejiang University has 8 campuses and a lot of gates. From each gate we ...
- Oracle DG备库强制switch_over过程
故障描述: 主库异常下线,需要将备库强制启动为主库,切断日志时提示需要介质恢复,执行介质恢复后,再激活日志即可进行切换 1. 执行alter database recover managed sta ...