一、query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示。那么两者区别,以及两者的效率如何?
答:1.scroll是用JDBC2.0的可滚动结果集实现;query.setMaxResults();query.setFirstResult()是数据库SQL语句实现。
2.你说是在数据库就分页好呢?还是把结果集都取到内存再分页好呢?(应该是在数据库就分了好些吧,但是如果在内存分页的话,换页的时候是不是更快一些呢?)
3.在数据库进行分页是首选的方式。数据库分页实际上是利用数据库本身SQL扩展的功能进行分页,例如MySQL的 limit 0,50这样的SQL语句。不但速度快,而且非常节省内存。不过不是每种数据库的都有这种分页支持的SQL,例如SQL Server就不支持。
4.scroll是利用JDBC2.0的功能做分页的,那么就完全取决于特定数据库的JDBC Driver的实现了。事实上大部分JDBC Driver都是把所有的结果集都一次取到内存,然后再分页的。如果这个结果集非常大,例如几万条,不但程序执行速度会很慢,而且很容易导致out of memory。当然个别JDBC Driver使用了服务器端游标来实现,那么就不会导致这种问题,例如jTDS。
二、Hibernate可以使用Query.setMaxResults方法简单地设置需要查询的最大结果集。
然后Hibernate会自动根据所设置的数据库方言翻译成相应的SQL语句提交给数据库。比如如果数据库是Oracle,SQL Server等,则翻译为类似select ... top 10之类的SQL语句,若是MySQL,则翻译为select ... limit 10之类的SQL。
三、举例:
query.setFirstResult(0),query.setMaxResults(4);相当于MySQL中的limit 0, 4;
public void testQuery() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Query query = session.createQuery("from User");
query.setFirstResult(0);//从第一条记录开始
query.setMaxResults(4);//取出四条记录
List userList = query.list();
for (Iterator iter=userList.iterator(); iter.hasNext();) {
User user = (User)iter.next();
System.out.println(user.getId());
System.out.println(user.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
自己测试:
HQL:
String hql =" from NumberBiz biz where biz.numberDepot.status=?" ;
Object[] values = {Constants.NUM_STATUS_NOT_AVAILABLE};
NumberBiz numberBiz = (NumberBiz)this.createQuery(session,hql,values).setFirstResult(0).setMaxResults(1).uniqueResult();
console view show_sql:
select
*
from
( select
numberbiz0_.id as id83_,
numberbiz0_.create_date as create2_83_,
numberbiz0_.create_by as create3_83_,
numberbiz0_.last_update_date as last4_83_,
numberbiz0_.last_update_by as last5_83_,
numberbiz0_.deleted as deleted83_,
numberbiz0_.addon_services as addon7_83_,
numberbiz0_.first_three_digits as first8_83_,
numberbiz0_.is_recommended as is9_83_,
numberbiz0_.last_four_digits as last10_83_,
numberbiz0_.middle_four_digits as middle11_83_,
numberbiz0_.minimum_expenses_per_month as minimum12_83_,
numberbiz0_.num_type as num13_83_,
numberbiz0_.num as num83_,
numberbiz0_.number_biz_group_id as number19_83_,
numberbiz0_.number_brands as number15_83_,
numberbiz0_.number_depot_id as number20_83_,
numberbiz0_.number_packages as number16_83_,
numberbiz0_.pre_pay as pre17_83_,
numberbiz0_.price as price83_
from
number_biz numberbiz0_,
number_depot numberdepo1_
where
numberbiz0_.number_depot_id=numberdepo1_.id
and numberdepo1_.status=?
)
where
rownum <= ?
分享到:
相关推荐
HQL的分页查询可以通过添加LIMIT子句来实现,但由于Hibernate的方言差异,我们需要借助于Query的setFirstResult和setMaxResults方法。例如: ```java Session session = sessionFactory.openSession(); String hql ...
在没有第三方库的情况下,可以使用Query的setFirstResult和setMaxResults方法实现分页: ```java int pageSize = 10; int pageNum = 2; query.setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize); ...
本文将探讨Hibernate中两种主要的分页方式:`query.scroll()`和使用`query.setFirstResult(), query.setMaxResults()`。 首先,`query.scroll()`方法基于JDBC 2.0的可滚动结果集实现。这种方式允许应用程序在结果...
2. 分页查询:使用setFirstResult和setMaxResults方法实现,避免一次性加载大量数据。 3. 联合查询:通过子查询或JOIN操作减少数据库访问次数。 七、事件监听机制 Hibernate支持事件监听,可以通过实现特定接口如...
在Hibernate中,实现分页查询通常涉及到`setFirstResult()`和`setMaxResults()`两个方法。 `setFirstResult(int start)`方法用于设置从数据库中开始获取结果集的位置,这个位置是基于0的索引,所以如果你想要获取第...
9. **分页和排序**:通过Query接口提供的setFirstResult和setMaxResults方法,可以轻松实现分页查询;而Order和Criteria的addOrder方法则用于实现查询结果的排序。 这个“hibernate-distribution-3.6.0.Beta3”...
4. 分页查询:避免一次性加载大量数据,可以使用HQL或Criteria的setFirstResult和setMaxResults方法进行分页。 5. 断言和日志:利用Hibernate的assertions功能进行数据验证,同时记录日志便于问题排查。 通过熟练...
1. **Query.setFirstResult() 和 Query.setMaxResults()**:这是Hibernate原生的分页方式,`setFirstResult()` 设置从第几个结果开始,`setMaxResults()` 设置最多返回多少个结果。 2. **Criteria API的createAlias...
2. 使用`setFirstResult()`和`setMaxResults()`方法设定分页参数。`setFirstResult()`指定从哪一条记录开始,`setMaxResults()`指定每页显示多少条记录。 ```java int startIndex = (currentPage - 1) * pageSize; ...
1. **Query接口的setFirstResult和setMaxResults方法** 这是实现分页最常用的方式。`setFirstResult(int firstResult)`设置从第几个结果开始获取,相当于SQL中的OFFSET;`setMaxResults(int maxResults)`设置最多...
2. 分页查询:避免一次性加载大量数据,使用LIMIT和OFFSET或者Criteria API的setFirstResult和setMaxResults方法。 3. 避免N+1查询问题:通过JOIN查询或子查询来获取关联数据,减少多次数据库访问。 4. 适当使用投影...
例如,使用`createCriteria()`创建Criteria,`add(Restriction)`添加查询条件,`setOrder(Order)`进行排序,`setFirstResult()`和`setMaxResults()`实现分页。 8. **Caching(缓存)** Hibernate5支持二级缓存,...
- 分页查询:使用Query的setFirstResult和setMaxResults方法,减少返回结果量。 通过深入理解Hibernate 4.3.9.Final,开发者可以更高效地管理数据库操作,提升应用性能,同时减少对SQL的依赖,专注于业务逻辑。...
### Hibernate 实现分页查询详解 #### 一、引言 在进行数据库操作时,为了提高用户体验和系统性能,分页查询是一项非常重要的技术。Hibernate作为Java领域内一个优秀的对象关系映射(ORM)框架,提供了强大的数据...
5.3 分页查询:使用Criteria的setFirstResult()和setMaxResults()进行分页,提高查询效率。 5.4 异步处理:在大数据量操作时,考虑使用异步处理,避免阻塞主线程。 六、实战应用 6.1 案例分析:结合黑马程序员的...
1. **Criteria查询分页**:使用Criteria API的setFirstResult和setMaxResults方法,分别指定查询结果的起始位置和最大数量。 2. **HQL分页**:在HQL查询语句中添加LIMIT和OFFSET关键字,或者使用FIRST和SKIP关键字。...
4. **Query.setFirstResult()与setMaxResults()**: 这两个方法用于分页查询,但也可以配合批处理,比如每次获取一批数据进行处理,然后下一批,以此类推。 5. **Session的使用技巧**: 应尽量减少Session的生命周期...
3. **集合分页**: 使用Query的setFirstResult()和setMaxResults()方法实现分页查询,避免一次性加载大量数据。 通过以上讲解,我们可以看到,传智播客的Hibernate教程覆盖了从基础到进阶的各个方面,为初学者提供了...
通过设置`setFirstResult()`和`setMaxResults()`方法,可以实现分页效果。例如: ```java Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult(pageNumber * pageSize); criteria...
Hibernate提供了List接口的setFirstResult和setMaxResults方法,可以实现分页查询。这两个方法分别对应SQL的OFFSET和LIMIT。在HQL查询中,可以使用setFirstResult和setMaxResults来控制返回的结果集,从而实现分页。...