いくつかの投稿で示されている基本リポジトリ ソリューションを使用して、動的クエリ (Spring Data 仕様を使用) でのカウント パフォーマンスの低下を回避できました。
public class ExtendedRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements ExtendedRepository<T, ID> {
private EntityManager entityManager;
public ExtendedRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
}
@Override
public List<T> find(Specification<T> specification, int offset, int limit, Sort sort) {
TypedQuery<T> query = getQuery(specification, sort);
query.setFirstResult(offset);
query.setMaxResults(limit);
return query.getResultList();
}
}
6M レコードのデータセットから 20 個のレコード スライスを取得するクエリは、このアプローチでは数ミリ秒かかります。同じフィルター処理されたクエリを SQL で実行します。
を使用した同様の実装Slice<T> find(Specification<T> specification, Pageable pageable)
には、10 秒以上かかります。
また、同様の実装で戻るにPage<T> find(Specification<T> specification, Pageable pageable)
は約 15 秒かかります。