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ドライバーがスクロール可能な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()

この機能には、開いているデータベース接続とカーソルが必要であることに注意してください。オフラインのページ付け機能が必要な場合はsetMaxResult()/を使用 してください。setFirstResult()

于 2010-11-13T09:53:53.817 に答える
9

他の回答から判断すると、JPAは直接スクロールをサポートしていませんが、JPA実装としてHibernateを使用する場合は、次のことができます。

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>非常に限定されたリスト実装を作成する必要があります。IteratorScrollableResultsList<E>

この実装は、私のIterableListScrollableResults.javaGistで利用できます。

また、定期的にHibernateエンティティをセッションからフラッシュします。これを使用する方法は次のとおりです。たとえば、アーカイブされていないすべてのエンティティをforループ付きのテキストファイルとしてDBからエクスポートする場合です。

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

また、SpringDataを使用することもできます。そこで、クエリを指定し、パラメータとして、ページサイズとページ番号を指定する「PageRequest」を渡すことができます。

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

このためには、PagingAndSortingRepositoryを拡張する必要があります。

結果をページングするための別の代替手段と同じように。

もちろん、その下では、Hibernate、Toplink、または構成したJPA実装を使用しています。

于 2013-10-31T16:44:25.263 に答える