Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Spring Batch (ItemReader) + Spring Data JPA (JpaRepository) integration
import java.util.concurrent.CopyOnWriteArrayList;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.database.AbstractPagingItemReader;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
/**
* Permet d'utiliser un {@link JpaRepository} comme {@link ItemReader},
* en utilisant la pagination lors de l'exécution de la requête JPQL.
* <p>
* L'appel à {@link #doReadPage()} incrémente {@link #getPage()}.
* <br/>
* La lecture (read()) retourne un page (bloc de n éléments).
* <br/>
* Par défaut, {@link #getPageSize} = 10.
* </p>
* <p>
* <i>JpaRepository extends PagingAndSortingRepository</i>, la pagination est donc supportée
* grâce à la méthode <code>findAll()</code>.
* </p>
*
* @see org.springframework.batch.item.database.JpaPagingItemReader
* @see org.springframework.batch.item.data.RepositoryItemReader
*
* @param <T> Entity JPA.
*/
public class JpaRepositoryItemReader<T>
extends AbstractPagingItemReader<T>
{
/**
* Spring Data JPA : {@link JpaRepository}.
*/
private JpaRepository<T, ?> jpaRepository;
/**
* Spring Data : {@link Sort}.
*/
private Sort sort;
/**
* Par défaut {@link #getPageSize()} = 10.
*
* @param jpaRepository JpaRepository (Spring Data JPA).
*/
public JpaRepositoryItemReader(JpaRepository<T, ?> jpaRepository)
{
Assert.notNull(jpaRepository, "JpaRepository doit etre non null");
this.jpaRepository = jpaRepository;
}
/**
*
* @param jpaRepository JpaRepository (Spring Data JPA).
* @param pageSize Définit {@link #getPageSize()}.
*/
public JpaRepositoryItemReader(JpaRepository<T, ?> jpaRepository, int pageSize)
{
this(jpaRepository);
setPageSize(pageSize);
}
/**
*
* @param jpaRepository JpaRepository (Spring Data JPA).
* @param pageSize Définit {@link #getPageSize()}.
* @param sort Options de tri pour la requête : {@link Sort}.
*/
public JpaRepositoryItemReader(JpaRepository<T, ?> jpaRepository, int pageSize, final Sort sort)
{
this(jpaRepository, pageSize);
this.sort = sort;
}
@Override
protected void doReadPage()
{
Pageable pageable;
if (sort == null)
{
pageable = new PageRequest(getPage(), getPageSize());
}
else
{
pageable = new PageRequest(getPage(), getPageSize(), sort);
}
Page<T> pageResults = jpaRepository.findAll(pageable);
if (results == null)
{
results = new CopyOnWriteArrayList<T>();
}
else
{
results.clear();
}
if (!pageResults.getContent().isEmpty())
{
results.addAll(pageResults.getContent());
}
}
@Override
protected void doJumpToPage(int itemIndex)
{
}
}
import java.util.List;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
/**
* Permet d'utiliser un {@link JpaRepository} comme {@link ItemWriter}.
* <p></p>
* Integration Spring Batch / Spring Data JPA.
* <br>
* A tester (transaction, EntityManager...).
* <br>
* Peu de plus-value par rapport à {@code JpaItemWriter},
* si ce n'est d'éviter de manipuler directement {@code EntityManagerFactory}.
*
* @see JpaRepository
* @see org.springframework.batch.item.database.JpaItemWriter
* @see org.springframework.batch.item.data.RepositoryItemWriter
*
* @param <T> Entity JPA
*/
public class JpaRepositoryItemWriter<T>
implements ItemWriter<T>
{
/**
* Spring Data JPA : JpaRepository.
*/
private JpaRepository<T, ?> jpaRepository;
public JpaRepositoryItemWriter(JpaRepository<T, ?> jpaRepository)
{
Assert.notNull(jpaRepository, "JpaRepository doit etre non null");
this.jpaRepository = jpaRepository;
}
@Override
public void write(List<? extends T> items) throws Exception
{
for (T item : items)
{
jpaRepository.save(item);
}
jpaRepository.flush();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment