版本hibernate3.2.6
数据库sql server 2k
hibernate左外连接同时即时抓取集合并利用setMaxResults()和setFirstResult()进行分页会出现
WARN [main] QueryTranslatorImpl.list(328) | firstResult/maxResults specified with collection fetch; applying in memory!的警告
在hibernate实战一书中也提到这样的语句在语义上就是错的,并且hibernate会退回到在内存中现在结果
Query execution options that are based on the SQL result rows, such as pag-ination with setMaxResults()/setFirstResult(), are semantically incor-rect if a collection is eagerly fetched. If you have an eager fetched collectionin your query, at the time of writing, Hibernate falls back to limiting theresult in-memory, instead of using SQL.
举个例子:
Group和User是1:n
方式一:
String hql = new String("select g from Group g left join fetch g.users u ");
Query query = session.createQuery(hql);
query.setFirstResult(startRow);
query.setMaxResults(pageSize);
List<Group> groups = query.list();
出现了上面的警告!
方式二:
List<Group> groups = new ArrayList<Group>();
String hql = new String("select g, u from Group g left join g.users u order by g.groupId ");
Query query = session.createQuery(hql);
ScrollableResults scrollCursor = query.scroll(ScrollMode.FORWARD_ONLY);
int index = 0;
Group group = null;
User user = null;
Integer groupId = null; //记住上一个Group标识
int count = 0;
int size = 0;
while ( scrollCursor.next() ) {
group = (Group) scrollCursor.get(0);
Integer groupIdTemp = group.getGroupId(); //用于判断是否是同一个Group
if ( index >= startRow ) {
user = (User) scrollCursor.get(1);
size = groups.size();
if ( groupIdTemp.equals(groupId) ) { //重复Group,往对应的Group添加role
if ( size > 0 ) { //当起始行不是0且该startRow-1的Group存在User集合时,过滤掉这些User
groups.get(size-1).getUsers().add(user);
}
} else { //Group不同时,把Group添加到list里
if ( index == (startRow+pageSize) ) break; //控制与pageSize相同
Set<User> users = new LinkedHashSet<User>();
if ( user != null ) {
users.add(user);
}
group.setUsers(users);
//记住最后一个的Group标识
groupId = group.getGroupId();
groups.add(group);
index++;
}
} else {
if ( !groupIdTemp.equals(groupId) ) {
//记住最后一个的Group标识
groupId = group.getGroupId();
index++;
}
}
if ( ++count%50 == 0 ) session.clear(); //清除已经结束的查询
}
scrollCursor.close();
自己用游标控制分页,但感觉这种方式效率上不是很好!
不知道有谁有更好的方法来解决这问题?
分享到:
相关推荐
通过以上介绍,你应该对HQL分页有了基本理解。实践中,还需要根据具体项目需求和数据库类型进行调整,优化查询性能,提升用户体验。如果你需要进一步学习,可以参考提供的博文链接,那里可能有更详细的讨论和示例...
- **HQL分页**:通过Hibernate Query Language(HQL)提供的分页方法实现。 #### 三、SSH分页案例分析 本节将通过具体的代码示例,展示如何在SSH框架中实现分页功能。 ##### 1. `PageBean`类 ```java public ...
HQL支持各种复杂的查询,包括但不限于分页查询、模糊查询等。 #### 二、HQL基本查询 在给定的代码示例中,展示了如何进行简单的HQL查询。例如: ```java final String hql = "from User as u where u.name = :...
#### 二、HQL分页简介 HQL是Hibernate提供的面向对象的查询语言,它类似于SQL但更接近于面向对象的思想。在Hibernate中使用HQL进行分页查询主要依赖于`setFirstResult()`和`setMaxResults()`两个方法。其中: - `...
本篇将详细讲解HQL中的命名参数以及如何通过Query接口实现分页查询,这对于开发大型数据应用来说是至关重要的。 首先,我们来看HQL中的命名参数。在编写HQL查询语句时,我们可以使用`:paramName`的方式来定义参数,...
本项目提供的源码是针对HQL(Hive Query Language)集合进行静态分析,以生成HQL查询语句所对应的血缘图。 HQL是Apache Hive的数据仓库工具,用于编写SQL-like查询以处理大数据集。在大型数据处理场景中,HQL经常被...
HQL语句 HQL语句 HQL语句 HQL语句 HQL语句
Hql PPt Hql PPt
当需要同时查询多个字段时,可以在HQL语句中指定这些字段,并通过索引来访问这些字段值: ```java String hql = "select u.name, u.age from com.mypack.User4 u"; Query query = session.createQuery(hql); List ...
在深入探讨HQL语法之前,我们首先需要理解什么是HQL。HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。与SQL(Structured Query Language)不同,HQL是专为ORM(Object-...
不喜欢使用myEclipse的...最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。 由于MyEclipse是收费的,速度不是很理想。所以在网上找到了一个elipse插件 英文图文教程 ...
- **目标**: 掌握HQL数据查询技术、实体查询、属性查询、参数绑定、查询排序、查询分组及查询分页等技能。 #### 四、总结 通过对以上知识点的学习,可以深入理解HQL在处理不同场景下的应用技巧,特别是关联关系的...
在IT领域,尤其是在Java开发中,...在实际开发中,熟练掌握HQL有助于编写出简洁、高效的数据库查询,同时减少与数据库交互的复杂性。熟悉HQL,对于理解和使用Hibernate框架至关重要,能够提升开发效率,降低维护成本。
此外,HQL支持动态查询,可以方便地处理集合类型的参数。 四、HQL的高级特性 1. 关联查询:HQL允许直接在查询中包含关联对象,如“SELECT u FROM User u JOIN u.address a WHERE a.city='北京'”。 2. 子查询:...
在开发过程中,经常会遇到需要从数据库中获取多个实体或者实体集合的情况,这时就需要用到HQL的多结果集查询功能。 #### 二、HQL多结果集概述 HQL多结果集是指在一个查询语句中返回多个结果集,这些结果集可以是...
同时,HQL也常与Spring Data JPA等框架结合,实现更加便捷的持久层操作。 综上所述,HQL作为Hibernate的重要组成部分,不仅简化了对象与数据库之间的交互,而且提供了丰富的查询功能。理解和熟练掌握HQL,能够帮助...