`
cys6736873
  • 浏览: 3862 次
  • 性别: 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();
自己用游标控制分页,但感觉这种方式效率上不是很好!

不知道有谁有更好的方法来解决这问题?
分享到:
评论

相关推荐

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

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

    hql分页

    hql分页 博文链接:https://shangdiyefankun.iteye.com/blog/107381

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

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

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

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

    HQL语句 HQL语句

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

    hql语句大全hql语句大全

    hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全

    SSh sql/hql 分页

    SSH 分页的例子源代码 全~~ 代码很全面了适合新手借鉴。但不支持完全的抄袭自己写还是最快的学习办法。

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

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

    HQL语句大全HQL语句大全

    HQL语句大全HQL语句大全HQL语句大全HQL语句大全HQL语句大全

    hql ppt Hql PPt

    Hql PPt Hql PPt

    HQL 详解 HQL查询

    因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形势如下

    HQL Eclipse Plugins 配置教程

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

    hql模糊查询hql模糊查询

    hql模糊查询hql模糊查询hql模糊查询hql模糊查询

    C# NHibernate 分页 HQL 源码

    使用vs2010打开解决方案。 把网站 App_Data 中的数据库附加一下。我这里用的是sql2008 SQLEXPRESS 修改Web.config 连接数据库配置 &lt;property name="connection.connection_string"&gt;Server=PC2011022315OVP\SQL...

    本项目实现了对hql集合进行静态分析,获取hql对应的血缘图(表血缘 + 字段血缘)

    在数据仓库建设中,经常会使用到数据血缘追中方面的功能,本项目实现了对hql集合进行静态分析,获取hql对应的血缘图(表血缘 + 字段血缘);删除hive-exec与hadoop-common的maven依赖,使得项目更加的轻量级。重构...

    Hibernate框架]Hql语句in中带参数的写法

    在HQL语句中,使用in关键字可以实现集合参数的传递,例如: ```java String hql = "FROM Login login WHERE login.id in (:ids)"; ``` 其中,`:ids`是参数的名称,需要在map中进行设置。 二、setParameter方法的...

    hql语句 使用大全

    hql语句常规 方法 使用 了解hql语句

Global site tag (gtag.js) - Google Analytics