10

我在 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);

是否有 jpa/hibernate 替代方案?

4

5 回答 5

12

据我所知,JPA 对此没有任何标准。

对于 Hibernate,我所知道的最接近的替代方案是Query/ ScrollableResultsAPI。从文档中:

10.4.1.6。可滚动迭代

如果您的 JDBC 驱动程序支持可滚动的 ResultSets,则 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()

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

于 2010-11-13T09:53:53.817 回答
9

从其他答案来看,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);

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

于 2017-02-23T09:58:04.250 回答
4

在基于List<E>实例处理大型项目代码中的大量实体时,我必须编写一个非常有限的 List 实现,仅Iterator支持浏览一个ScrollableResults而不使用重构所有服务实现和方法原型List<E>

这个实现在我的IterableListScrollableResults.java Gist中可用

它还定期从会话中刷新 Hibernate 实体。这是一种使用它的方法,例如,当从 DB 中将所有非归档实体导出为带有for循环的文本文件时:

Criteria criteria = getCurrentSession().createCriteria(LargeVolumeEntity.class);
criteria.add(Restrictions.eq("archived", Boolean.FALSE));
criteria.setReadOnly(true);
criteria.setCacheable(false);
List<E> result = new IterableListScrollableResults<E>(getCurrentSession(),
        criteria.scroll(ScrollMode.FORWARD_ONLY));
for(E entity : result) {
    dumpEntity(file, entity);
}

希望它可能会有所帮助

于 2014-04-01T14:02:11.813 回答
1

在 JPA 中,您可以使用 query.setFirstResult 和 query.setMaxResults

于 2010-11-16T14:50:35.963 回答
1

也可以选择使用 Spring Data。在那里您可以指定查询并作为参数传递一个“PageRequest”,您可以在其中指定页面大小和页码:

Page<User> users = repository.findAll(new PageRequest(1, 20));

为此,您需要扩展 PagingAndSortingRepository。

就像对结果进行分页的另一种选择一样。

当然,在下面,它使用 Hibernate、Toplink 或您配置的任何 JPA 实现。

于 2013-10-31T16:44:25.263 回答