-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Closed
Milestone
Description
Expected Behavior
JpaCursorItemReaderBuilder should have an option to set fetchSize, similar to HibernateCursorItemReader (which is deprecated) and JdbcCursorItemReaderBuilder.
Current Behavior
There is no option to fetch size for query executed by JpaCursorItemReader. As a workaround I created FetchSizeAwareJpaQueryProvider. Pasting here in case someone would like to use it:
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import org.hibernate.jpa.AvailableHints;
import org.springframework.batch.item.database.orm.JpaQueryProvider;
/**
* {@link JpaQueryProvider} implementation that enables setting "FETCH_SIZE" query hint on the JPA query.
*
* <a href="https://jdbc.postgresql.org/documentation/query/#getting-results-based-on-a-cursor">Getting results based on a cursor</a>
*
* @author Maciej Walkowiak
*/
public class FetchSizeAwareJpaQueryProvider implements JpaQueryProvider {
private final String queryString;
private final int fetchSize;
private EntityManager entityManager;
public FetchSizeAwareJpaQueryProvider(String queryString, int fetchSize) {
this.fetchSize = fetchSize;
this.queryString = queryString;
}
@Override
public Query createQuery() {
Query query = this.entityManager.createQuery(queryString);
query.setHint(AvailableHints.HINT_FETCH_SIZE, fetchSize);
return query;
}
@Override
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}.. and use it like this:
new JpaCursorItemReaderBuilder<...>()
.name("...")
.entityManagerFactory(..)
.queryProvider(new FetchSizeAwareJpaQueryProvider("<jpql query>", 100))
.build();If it makes sense I can see if I find time to contribute it.
LichKing-lee