- 浏览: 18974 次
- 性别:
- 来自: 韶关
-
最新评论
(转) firstResult/maxResults specified with collection fetch; applying in memory!
- 博客分类:
- java
之前遇到了同样的问题。记录一下:
WARNING: firstResult/maxResults specified with collection fetch; applying in memory! ---------------------------------------- hxzon:使用了join fetch p.items导致这个警告。 ---------------------------------------- 学习Hibernate时,经常会遇到Hibernate性能问题,这里将介绍Hibernate性能问题的解决方法。 在使用Hibernate进行分页的过程中,如果你收到如下警告,那么这里就是一个潜在的Hibernate性能问题点: WARNING: firstResult/maxResults specified with collection fetch; applying in memory! 出现这个警告的直接后果是:无论你想要看第几页的数据,从Hibernate打印出的SQL来看它总是查询了所有满足条件的结果。这是为什么呢?来看看这 句警告所在的代码,它位于org.hibernate.hql.ast.QueryTranslatorImpl.list中。 public List list(SessionImplementor session, QueryParameters queryParameters) throws HibernateException { // Delegate to the QueryLoader... errorIfDML(); QueryNode query = ( QueryNode ) sqlAst; boolean hasLimit = queryParameters.getRowSelection() != null && queryParameters.getRowSelection().definesLimits(); boolean needsDistincting = ( query.getSelectClause().isDistinct() || hasLimit ) && containsCollectionFetches(); QueryParameters queryParametersToUse; if ( hasLimit && containsCollectionFetches() ) { log.warn( "firstResult/maxResults specified with collection fetch; applying in memory!" ); RowSelection selection = new RowSelection(); selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() ); selection.setTimeout( queryParameters.getRowSelection().getTimeout() ); queryParametersToUse = queryParameters.createCopyUsing( selection ); } else { queryParametersToUse = queryParameters; } List results = queryLoader.list( session, queryParametersToUse ); if ( needsDistincting ) { int includedCount = -1; // NOTE : firstRow is zero-based int first = !hasLimit || queryParameters.getRowSelection().getFirstRow() == null ? 0 : queryParameters.getRowSelection().getFirstRow().intValue(); int max = !hasLimit || queryParameters.getRowSelection().getMaxRows() == null ? -1 : queryParameters.getRowSelection().getMaxRows().intValue(); int size = results.size(); List tmp = new ArrayList(); IdentitySet distinction = new IdentitySet(); for ( int i = 0; i < size; i++ ) { final Object result = results.get( i ); if ( !distinction.add( result ) ) { continue; } includedCount++; if ( includedCount < first ) { continue; } tmp.add( result ); // NOTE : ( max - 1 ) because first is zero-based while max is not... if ( max >= 0 && ( includedCount - first ) >= ( max - 1 ) ) { break; } } results = tmp; } return results; }关键在于if ( hasLimit && containsCollectionFetches() 这句判断,如果满足了这个条件,RowSelection将会被重新生成,原本分页需要的firstRow和maxRows属性将会丢失,后面的数据库分 页自然也无法进行。Hibernate这么做的原因从代码上也很容易理解,如果查询需要限制条数(limit/offset)并且需要fetch结合对 象,则重新生成RowSelection,进一步解释,就是当一个实体(A)和另一个实体(B)是One-To-Many关系的时候,一个需要fetch 的典型查询语句是“select distinct a from A a left join fetch a.b”,由于1个A可能对应多个B,这个时候数据库查询的结果条数和需要生成的A对象的条数可能不一致,所以无法利用数据库层的分页来实现,因为你真正 想分页的是A而不是A left join B。出现这个警告就是提醒你这个查询实际上是查询了所有满足条件的数据,Hibernate是在内存中对其进行了假分页的处理。 这样,对于查询结果比较多的情况无疑是一个Hibernate性能上的潜在威胁。碰到这样的情况,将Many的查询进行分开也是一种解决办法
发表评论
-
(转)在swing中显示web页面~~
2011-05-14 16:42 1689http://www.chinajavaworld.com/t ... -
映射枚举
2010-11-18 13:07 932Hibernate对枚举类型映射类EnumType对id的支持 ... -
收藏卡了。。复制一下吧。。
2010-11-01 14:20 596import java.util.Arrays; im ... -
追MM的23种设计模式 (转)
2010-11-01 13:32 602创建型模式 1、FACTORY— ... -
截字符串
2010-11-01 12:14 620<c:set var="subStr" ... -
editplus右键打开(转)
2010-10-22 22:45 2093经常有这样的情况, 本来右键里原有的Editplus打开文件项 ... -
一封装的参考
2010-10-21 14:09 6811. Page.java package cn.loen.p ... -
base(转)
2010-10-20 20:25 592package pack.java.ssh.basedao; ... -
优化策略
2010-10-18 22:44 6761、outer-join关键字(many-to-one的情况) ... -
刚学hibernate遇到不能保存问题,查到后找到方法解决~
2010-10-18 22:19 975hibernate.hbm.xml中加入 <pro ... -
(转)Struts1+Spring+Hibernate配置
2010-10-15 17:50 920开发环境:MyEclipse6.0+Tomcat5.0+Ora ... -
(转)Struts2+Spring2+Hibernate3开发环境搭建
2010-10-15 17:49 820看到网上有很多ssh配置文章,但是有很多是调不通的,还有版本不 ... -
(转)MyEclipse从数据库反向生成实体类之Hibernate方式
2010-10-15 17:48 1060上次谈到利用MyEclipse ... -
对Struts2 OGNL的分析与简介
2010-10-12 23:10 999Struts2 OGNL基础上的增强 1、值栈(ValueS ... -
java串口编程(转)
2010-10-09 14:12 7301. SerialBean SerialBean是本类库与其他 ... -
myeclipse8.0如何安装 visual class
2010-10-08 17:35 1045打开Help-->Install-->New So ... -
jsp_AJAX 下拉连动_2
2010-10-08 14:49 474<%@ page language="java ... -
jsp_AJAX 下拉连动
2010-10-08 14:47 672引用 <%@ page language=" ...
相关推荐
在Java的持久化框架Hibernate中,分页查询是常见的需求,它可以帮助我们有效地管理大量数据,提高系统的性能。本文将详细讲解如何在Hibernate中实现真分页(物理分页)和假分页(逻辑分页)。 ...
Hibernate分页可能引起的性能问题 在使用Hibernate进行分页的过程中,如果你收到如下警告,那么这里就是一个潜在的性能问题...WARNING: firstResult/maxResults specified with collection fetch; applying in memory!
很实用值得借鉴的一个分页例子,性能高,只需要传你要的参数就可以实用了
4. 分页查询时,使用LIMIT或FirstResult/MaxResults避免大量数据加载。 四、缓存策略 1. 第一级缓存:SessionFactory级别的缓存,默认开启,无需额外配置。控制好实体的状态管理,避免脏数据。 2. 第二级缓存:可...
Hibernate 提供了 ScrollableResults 和 FirstResult/MaxResults 方法来实现分页。ScrollableResults 允许按需加载结果集,避免一次性加载大量数据造成内存压力;FirstResult 设置起始行,MaxResults 设置每页的最大...
`findByExample()` 返回所有符合条件的对象,而 `findByExample(..., firstResult, maxResults)` 可以指定返回结果的起始位置和最大数量,实现分页查询。 4. `findByNamedParam(String queryString, String param...
例如,通过设置FirstResult和MaxResults属性来指定查询的起始位置和记录数量,从而实现分页效果。 在实际的项目结构中,`accp_page`可能包含以下几个关键部分: 1. **Action类**:定义了处理用户请求的方法,如`...
Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults属性来实现分页。FirstResult表示从结果集的第几个元素开始获取,MaxResults...
参数firstResult和maxResults分别指定查询结果的起始位置和最大数量。 6. **findByNamedParam(String queryString, String paramName, Object value)**: 这种方法使用命名参数进行查询,提供更好的可读性。例如,...
findByExample(Object exampleEntity, int firstResult, int maxResults);findByNamedParam(String queryString , String paramName , Object value);findByNamedParam(String queryString , String[] paramName ,...
5. 分页与排序:通过设置Query的FirstResult和MaxResults属性实现分页,OrderBy方法进行排序。 NHibarnate_Library可能是包含示例代码、配置文件或教程文档的资源包。这些文件可以帮助你理解如何配置NHibernate,...
1. **设置FirstResult和MaxResults**: `Criteria` API 提供了`setFirstResult(int firstResult)`和`setMaxResults(int maxResults)`方法来实现分页。`firstResult`表示查询结果的起始位置,`maxResults`表示每页显示...
在分页场景中,Hibernate的Criteria、Query或HQL语言可以配合FirstResult和MaxResults方法实现分页查询。另外,Hibernate的Criteria API允许我们动态构建查询条件,从而适应不同情况下的分页需求。 在“xxrlmis项目...
1. 分页查询:通过设置FirstResult和MaxResults参数,实现分页查询,减少不必要的数据传输。 2. HQL与SQL的选择:HQL(Hibernate Query Language)提供了面向对象的查询方式,而原生SQL更适合复杂查询,根据需求灵活...
Hibernate提供了分页查询的功能,通过设置FirstResult和MaxResults属性,可以直接完成数据库的分页操作。 描述中的“复制写个sql就能用”意味着在实际开发中,开发者可能只需要编写一个SQL查询,结合Hibernate的API...
需要注意的是,不同的数据库可能有不同的分页语法,例如Oracle使用`ROWNUM`,SQL Server使用`OFFSET/FETCH`。在实际应用中,需要根据所使用的数据库调整分页查询的实现。 总结来说,Java实现分页功能的关键在于创建...
通常需要设置页码和每页大小,然后结合SQL的LIMIT和OFFSET或使用HQL的firstResult和maxResults来实现。 4. 排序查询:可以按照指定字段进行升序或降序排序。 SSH框架中的分页实现: 1. 通过前端传递页码和每页大小...
在分页查询时,Hibernate提供了一些API,如Criteria、HQL(Hibernate Query Language)或SQL,通过设置Query的FirstResult和MaxResults属性来实现分页。 分页的实现通常包括以下几个步骤: 1. **前端请求**:用户...
Hibernate提供了Criteria、HQL以及Query接口的分页功能,开发者可以通过设置firstResult和maxResults参数实现这一目标。 3. **登录与注册**:这是任何有用户管理系统的Web应用的基础。登录通常涉及用户凭证的验证,...
在Hibernate中,实现分页主要涉及两个关键参数:`firstResult`和`maxResults`。`firstResult`定义了查询开始的位置,`maxResults`限制了返回结果的数量。这样,我们可以通过改变这两个参数实现数据的不同页面。例如...