投影查询——过滤部分字段
返回的List集合元素为Object[]
Query query = session.createQuery("select c.cname, c.csex from Customer c");
List list = query.list();
Iterator iter = list.iterator();
Object[] objs = null;
while(iter.hasNext()){
objs = (Object[]) iter.next();
for(int i = 0; i < objs.length; i ++){
System.out.println(objs[i]);
}
System.out.println("-------------------");
}
分页查询
Query query = session.createQuery("from Customer c");
query.setFirstResult((当前页-1) * 页大小);//从哪儿开始取
query.setMaxResults(页大小);//最多取多少条记录
Iterator iter = query.list().iterator();
Customer c = null;
while(iter.hasNext()){
c = (Customer) iter.next();
System.out.print(c);
}
连接查询——多表连接
连接类型 HQL语法
内连接 inner join 或者 join
迫切内连接 inner join fetch 或者 join fetch
左外连接 left outer join 或者 left join
迫切左外连接 left outer join fetch 或者 left join fetch
右外连接 right outer join 或者 right join
迫切左外连接
Query query = session.createQuery("from Customer c left join fetch c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:left join fetch
返回结果为Customer类型,再通过Customer对象导航到Orders对象
返回结果可能包含重复元素,通过Set去掉重复行
结果见备注
左外连接
Query query = session.createQuery("from Customer c left join c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:left join
返回的集合中,元素类型为Object[],该数组包含Customer和Orders对象,即:Object[0]=Customer,Object[1]=Orders
没有重复元素
结果见备注
内连接
Query query = session.createQuery("from Customer c inner join c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:inner join
返回的集合中,元素类型为Object[],该数组包含Customer和Orders对象,即:Object[0]=Customer,Object[1]=Orders
没有重复元素
结果见备注
和左外连接的处理方式相同
迫切内连接
Query query = session.createQuery("from Customer c inner join fetch c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:inner join fetch
返回结果为Customer类型,再通过Customer对象导航到Orders对象
返回结果可能包含重复元素,通过Set去掉重复行
结果见备注
处理方式和迫切左外连接相同
右外连接
Query query = session.createQuery("from Customer c right outer join c.orders o");
Iterator iter = query.list().iterator();
说明:
关键字:right outer join
返回的集合中,元素类型为Object[],该数组包含Customer和Orders对象,即:Object[0]=Customer,Object[1]=Orders
没有重复元素
结果见备注
和左连接、内连接的处理方式相同
投影查询
Query query = session.createQuery("select c.cid, c.cname, o.odate from Customer c right outer join c.orders o");
Iterator iter = query.list().iterator();
说明
投影即只返回一部分字段
返回的结果集中,元素类型为Object[],数组中元素个数即为select语句后的字段个数
结果见备注
分组查询与聚合查询——group by
对客户按性别分组
select c.csex, count(*) from Customer c group by c.csex
说明:
返回的结果集中,元素类型为Object[],数组元素个数即为返回的字段个数
统计出每个客户的订单数量
select c.cname, count(o) from Customer c left join c.orders o group by c.cname
找出年龄最大的客户
Query query = session.createQuery("select max(c.cage) from Customer c");
Object obj = query.uniqueResult();
通过uniqueResult()保证只返回一个结果
代码见备注
子查询
找出年龄大于平均年龄的客户
select c.cname, c.cage from Customer c where c.cage > (select avg(c.cage) from Customer c)
结果见备注
子查询可以和all,any,some,in,exists使用
找出至少有一份订单的客户
from Customer c where exists (from c.orders)
代码见备注
总结
了解Hibernate的检索策略对于查询结果的优化大有稗益
Hibernate的HQL语法和sql非常相似,有sql基础的人非常容易学习
只有精通SQL才能灵活应用,这一点毋庸置疑
分享到:
相关推荐
当我们需要进行更复杂的数据库查询时,Hibernate提供了丰富的高级查询功能,这正是“Hibernate的高级查询”这一主题的核心所在。 在Hibernate中,高级查询主要包括HQL(Hibernate Query Language)、Criteria API和...
本资源“Hibernate QBC高级查询”聚焦于Hibernate Query by Criteria(QBC)的高级用法,旨在帮助开发者深入理解并熟练运用这一强大的查询机制。 Query by Criteria是Hibernate提供的另一种查询方式,与HQL...
除了基础的查询,Hibernate还支持连接查询、子查询、聚合函数等高级功能。例如,如果你需要根据用户的年龄进行分组并计算每个年龄段的用户数量,可以这样写: ```java String hql = "select age, count(*) from ...
《Hibernate高级教程》是一份深度探索Java对象关系映射(ORM)框架Hibernate的教程,它包含14个精心设计的章节,旨在帮助开发者深入理解并掌握Hibernate的核心特性和高级用法。以下是对这些章节可能涉及的主要知识点...
QueryOver是NHibernate(.NET版Hibernate)引入的一个高级查询API,但也可以在Java Hibernate中使用,它提供了更丰富的查询语法。虽然在Java中使用QueryOver不如使用Criteria API常见,但在某些场景下,QueryOver能...
本文详细介绍了 Hibernate 提供的各种查询方式,包括 `load`、`get`、`createQuery` 和 `find` 等方法,并重点阐述了 HQL 查询的基本用法和高级技巧。通过本文的学习,读者可以掌握 Hibernate 的基本查询操作,并能...
除了状态转换,数据缓存也是Hibernate高级特性的一部分。Hibernate提供了First-Level Cache(一级缓存)和Second-Level Cache(二级缓存)来优化性能。一级缓存是每个Session的私有缓存,存储了Session内的实体对象...
总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...
Hibernate高级查询 介绍了hibernate的各种查询方法,以及HQL的使用
尽管Hibernate提供了一系列高级查询机制,但在某些情况下直接使用SQL查询仍然非常有用。 **特点:** - **直接性强:** 直接使用SQL查询,能够利用数据库本身的优化能力。 - **易理解:** 对于大多数开发者来说,...
本实例主要探讨的是Hibernate的高级映射技术,包括单向一对一、单向多对一、单向一对多以及单向多对多这四种关系映射。 首先,我们来理解一下什么是映射。在Hibernate中,映射是将对象模型与关系数据库之间的桥梁,...
Hibernate高级 1.Hibernate中文手册 2.Hibernate课件 Javascript高级 1.JS验证大全(很全) 2.Javascript高级教程 3.Javascript参考手册 CSS滤镜 1.精通CSS--滤镜 JSP高级编程 1.jsp高级编程 插件编程 1....
Hibernate支持设置批处理大小,通过`Session.flush()`方法强制刷新缓存中的操作,批量提交到数据库。 8. **级联操作** 级联操作允许在一个实体的操作中自动处理其关联的实体。例如,`CascadeType.ALL`将使保存、...
在Java中,我们可以使用JPA(Java Persistence API)或Hibernate等ORM框架来实现高级查询。例如,JPA提供了 Criteria API 和 Querydsl 等工具,它们可以用来创建动态、类型安全的查询,避免了SQL注入的风险。...
**Hibernate高级操作** 在Java开发领域,Hibernate是一个广泛使用的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。深入理解Hibernate的高级操作对于提升开发效率和代码...
此外,项目可能还会涉及二级缓存的使用,以及如何在查询中进行分页、排序、聚合函数的应用等高级特性。学习并实践这些内容,不仅可以加深对Hibernate的理解,还能提高代码的可读性和维护性。 总之,通过“Hibernate...
综上所述,Hibernate的高级操作涵盖了各种查询方式、关联管理、事务处理、缓存机制等多个方面,熟练掌握这些技巧将极大地提升开发效率和应用性能。通过深入学习《精通Hibernate》和《Hibernate的高级操作》等资料,...
hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置...hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
本项目标题提及的是“web高级查询+分页”,并且描述中提到了使用三大框架Struts2、Hibernate和Spring来实现这一功能。以下是关于这三个框架以及如何利用它们实现高级查询和分页的详细解释。 **Struts2框架** Struts...