`
hz_chenwenbiao
  • 浏览: 1008018 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate的setFirstResult,setMaxResults(转)

阅读更多

一、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 <= ? 
分享到:
评论

相关推荐

    Hibernate 分页查询效果

    HQL的分页查询可以通过添加LIMIT子句来实现,但由于Hibernate的方言差异,我们需要借助于Query的setFirstResult和setMaxResults方法。例如: ```java Session session = sessionFactory.openSession(); String hql ...

    通用的hibernate查询

    在没有第三方库的情况下,可以使用Query的setFirstResult和setMaxResults方法实现分页: ```java int pageSize = 10; int pageNum = 2; query.setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize); ...

    Hibernate中的query 分页.doc

    本文将探讨Hibernate中两种主要的分页方式:`query.scroll()`和使用`query.setFirstResult(), query.setMaxResults()`。 首先,`query.scroll()`方法基于JDBC 2.0的可滚动结果集实现。这种方式允许应用程序在结果...

    hibernate-orm-4.3.9源码

    2. 分页查询:使用setFirstResult和setMaxResults方法实现,避免一次性加载大量数据。 3. 联合查询:通过子查询或JOIN操作减少数据库访问次数。 七、事件监听机制 Hibernate支持事件监听,可以通过实现特定接口如...

    hibernate分页查询 数据库连接

    在Hibernate中,实现分页查询通常涉及到`setFirstResult()`和`setMaxResults()`两个方法。 `setFirstResult(int start)`方法用于设置从数据库中开始获取结果集的位置,这个位置是基于0的索引,所以如果你想要获取第...

    hibernate-distribution-3.6.0

    9. **分页和排序**:通过Query接口提供的setFirstResult和setMaxResults方法,可以轻松实现分页查询;而Order和Criteria的addOrder方法则用于实现查询结果的排序。 这个“hibernate-distribution-3.6.0.Beta3”...

    hibernate 数据库操作方法

    4. 分页查询:避免一次性加载大量数据,可以使用HQL或Criteria的setFirstResult和setMaxResults方法进行分页。 5. 断言和日志:利用Hibernate的assertions功能进行数据验证,同时记录日志便于问题排查。 通过熟练...

    Hibernate二级缓存+分页功能

    1. **Query.setFirstResult() 和 Query.setMaxResults()**:这是Hibernate原生的分页方式,`setFirstResult()` 设置从第几个结果开始,`setMaxResults()` 设置最多返回多少个结果。 2. **Criteria API的createAlias...

    Hibernate分页显示和添加

    2. 使用`setFirstResult()`和`setMaxResults()`方法设定分页参数。`setFirstResult()`指定从哪一条记录开始,`setMaxResults()`指定每页显示多少条记录。 ```java int startIndex = (currentPage - 1) * pageSize; ...

    hibernate分页技术

    1. **Query接口的setFirstResult和setMaxResults方法** 这是实现分页最常用的方式。`setFirstResult(int firstResult)`设置从第几个结果开始获取,相当于SQL中的OFFSET;`setMaxResults(int maxResults)`设置最多...

    Hibernate_5.2.11_Final

    2. 分页查询:避免一次性加载大量数据,使用LIMIT和OFFSET或者Criteria API的setFirstResult和setMaxResults方法。 3. 避免N+1查询问题:通过JOIN查询或子查询来获取关联数据,减少多次数据库访问。 4. 适当使用投影...

    Hibernate5实例程序

    例如,使用`createCriteria()`创建Criteria,`add(Restriction)`添加查询条件,`setOrder(Order)`进行排序,`setFirstResult()`和`setMaxResults()`实现分页。 8. **Caching(缓存)** Hibernate5支持二级缓存,...

    hibernate-release-4.3.9.Final.rar

    - 分页查询:使用Query的setFirstResult和setMaxResults方法,减少返回结果量。 通过深入理解Hibernate 4.3.9.Final,开发者可以更高效地管理数据库操作,提升应用性能,同时减少对SQL的依赖,专注于业务逻辑。...

    hibernate实现分页查询

    ### Hibernate 实现分页查询详解 #### 一、引言 在进行数据库操作时,为了提高用户体验和系统性能,分页查询是一项非常重要的技术。Hibernate作为Java领域内一个优秀的对象关系映射(ORM)框架,提供了强大的数据...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4

    5.3 分页查询:使用Criteria的setFirstResult()和setMaxResults()进行分页,提高查询效率。 5.4 异步处理:在大数据量操作时,考虑使用异步处理,避免阻塞主线程。 六、实战应用 6.1 案例分析:结合黑马程序员的...

    struts+hibernate分页

    1. **Criteria查询分页**:使用Criteria API的setFirstResult和setMaxResults方法,分别指定查询结果的起始位置和最大数量。 2. **HQL分页**:在HQL查询语句中添加LIMIT和OFFSET关键字,或者使用FIRST和SKIP关键字。...

    关于hibernate的批处理

    4. **Query.setFirstResult()与setMaxResults()**: 这两个方法用于分页查询,但也可以配合批处理,比如每次获取一批数据进行处理,然后下一批,以此类推。 5. **Session的使用技巧**: 应尽量减少Session的生命周期...

    传智播客_hibernate

    3. **集合分页**: 使用Query的setFirstResult()和setMaxResults()方法实现分页查询,避免一次性加载大量数据。 通过以上讲解,我们可以看到,传智播客的Hibernate教程覆盖了从基础到进阶的各个方面,为初学者提供了...

    hibernate实现分页

    通过设置`setFirstResult()`和`setMaxResults()`方法,可以实现分页效果。例如: ```java Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult(pageNumber * pageSize); criteria...

    Struts+Hibernate+Spring的分页

    Hibernate提供了List接口的setFirstResult和setMaxResults方法,可以实现分页查询。这两个方法分别对应SQL的OFFSET和LIMIT。在HQL查询中,可以使用setFirstResult和setMaxResults来控制返回的结果集,从而实现分页。...

Global site tag (gtag.js) - Google Analytics