`
cys6736873
  • 浏览: 3947 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

HQL即时抓取集合同时分页

阅读更多
版本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分页有了基本理解。实践中,还需要根据具体项目需求和数据库类型进行调整,优化查询性能,提升用户体验。如果你需要进一步学习,可以参考提供的博文链接,那里可能有更详细的讨论和示例...

    SSh sql/hql 分页

    - **HQL分页**:通过Hibernate Query Language(HQL)提供的分页方法实现。 #### 三、SSH分页案例分析 本节将通过具体的代码示例,展示如何在SSH框架中实现分页功能。 ##### 1. `PageBean`类 ```java public ...

    Hibernate HQL查询 分页查询 模糊查询.docx

    HQL支持各种复杂的查询,包括但不限于分页查询、模糊查询等。 #### 二、HQL基本查询 在给定的代码示例中,展示了如何进行简单的HQL查询。例如: ```java final String hql = "from User as u where u.name = :...

    hql criteria分页

    #### 二、HQL分页简介 HQL是Hibernate提供的面向对象的查询语言,它类似于SQL但更接近于面向对象的思想。在Hibernate中使用HQL进行分页查询主要依赖于`setFirstResult()`和`setMaxResults()`两个方法。其中: - `...

    Hibernate HQL命名参数和Query接口的分页

    本篇将详细讲解HQL中的命名参数以及如何通过Query接口实现分页查询,这对于开发大型数据应用来说是至关重要的。 首先,我们来看HQL中的命名参数。在编写HQL查询语句时,我们可以使用`:paramName`的方式来定义参数,...

    血缘关系解析工具源码_对hql集合进行静态分析_获取hql对应的血缘图.zip

    本项目提供的源码是针对HQL(Hive Query Language)集合进行静态分析,以生成HQL查询语句所对应的血缘图。 HQL是Apache Hive的数据仓库工具,用于编写SQL-like查询以处理大数据集。在大型数据处理场景中,HQL经常被...

    HQL语句 HQL语句

    HQL语句 HQL语句 HQL语句 HQL语句 HQL语句

    hql ppt Hql PPt

    Hql PPt Hql PPt

    hql语句 使用大全

    当需要同时查询多个字段时,可以在HQL语句中指定这些字段,并通过索引来访问这些字段值: ```java String hql = "select u.name, u.age from com.mypack.User4 u"; Query query = session.createQuery(hql); List ...

    HQL语法入门学习HQL语法入门学习

    在深入探讨HQL语法之前,我们首先需要理解什么是HQL。HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。与SQL(Structured Query Language)不同,HQL是专为ORM(Object-...

    HQL Eclipse Plugins 配置教程

    不喜欢使用myEclipse的...最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。 由于MyEclipse是收费的,速度不是很理想。所以在网上找到了一个elipse插件 英文图文教程 ...

    03-HQL实用技术.pdf

    - **目标**: 掌握HQL数据查询技术、实体查询、属性查询、参数绑定、查询排序、查询分组及查询分页等技能。 #### 四、总结 通过对以上知识点的学习,可以深入理解HQL在处理不同场景下的应用技巧,特别是关联关系的...

    精通HQL.doc

    在IT领域,尤其是在Java开发中,...在实际开发中,熟练掌握HQL有助于编写出简洁、高效的数据库查询,同时减少与数据库交互的复杂性。熟悉HQL,对于理解和使用Hibernate框架至关重要,能够提升开发效率,降低维护成本。

    Hibernate-HQL.rar_HQL_hibernate hql

    此外,HQL支持动态查询,可以方便地处理集合类型的参数。 四、HQL的高级特性 1. 关联查询:HQL允许直接在查询中包含关联对象,如“SELECT u FROM User u JOIN u.address a WHERE a.city='北京'”。 2. 子查询:...

    Hql多结果集

    在开发过程中,经常会遇到需要从数据库中获取多个实体或者实体集合的情况,这时就需要用到HQL的多结果集查询功能。 #### 二、HQL多结果集概述 HQL多结果集是指在一个查询语句中返回多个结果集,这些结果集可以是...

    HQL语言大全 高清晰可复制版

    同时,HQL也常与Spring Data JPA等框架结合,实现更加便捷的持久层操作。 综上所述,HQL作为Hibernate的重要组成部分,不仅简化了对象与数据库之间的交互,而且提供了丰富的查询功能。理解和熟练掌握HQL,能够帮助...

Global site tag (gtag.js) - Google Analytics