有没有办法用JPA/hibernate滚动结果?

yur*_*ura 9 java orm hibernate jpa toplink

我在Toplink找到了一些提示

Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.lastName ASC, e.firstName ASC");
query.setHint("eclipselink.cursor.scrollable", true);
ScrollableCursor scrollableCursor = (ScrollableCursor)query.getSingleResult();
List<Employee> emps = scrollableCursor.next(10);
Run Code Online (Sandbox Code Playgroud)

是否有jpa/hibernate备选方案?

Pas*_*ent 12

据我所知,JPA没有任何标准.

使用Hibernate,我所知道的最接近的选择是Query/ ScrollableResultsAPI.从文档:

10.4.1.6.可滚动迭代

如果JDBC驱动程序支持可滚动的ResultSet,则可以使用Query接口获取ScrollableResults对象,该对象允许灵活地导航查询结果.

Query q = sess.createQuery("select cat.name, cat from DomesticCat cat " +
                            "order by cat.name");
ScrollableResults cats = q.scroll();
if ( cats.first() ) {

    // find the first name on each page of an alphabetical list of cats by name
    firstNamesOfPages = new ArrayList();
    do {
        String name = cats.getString(0);
        firstNamesOfPages.add(name);
    }
    while ( cats.scroll(PAGE_SIZE) );

    // Now get the first page of cats
    pageOfCats = new ArrayList();    
    cats.beforeFirst();    
    int i=0;    
    while( ( PAGE_SIZE > i++ ) && cats.next() ) pageOfCats.add( cats.get(1) );

}

cats.close()
Run Code Online (Sandbox Code Playgroud)

请注意,此功能需要打开数据库连接和游标.如果您需要离线分页功能,请使用 setMaxResult()/ setFirstResult().

  • 不要忘记将 close() 放入 try ... 最后。 (2认同)

Jan*_*nis 5

从其他答案来看,JPA不支持直接滚动,但如果你使用Hibernate作为JPA实现,你可以做到

javax.persistence.Query query = entityManager.createQuery("select foo from bar");
org.hibernate.Query hquery = query.unwrap(org.hibernate.Query);
ScrollableResults results = hquery.scroll(ScrollMode.FORWARD_ONLY);
Run Code Online (Sandbox Code Playgroud)

它访问底层的Hibernate api以进行滚动,但您可以使用JPA查询的所有功能.(至少对于条件查询,JPA api具有一些旧Hibernate api中没有的功能.)