Suporte ao Spring Data Java 8

Suporte ao Spring Data Java 8

1. Visão geral

O Spring Data agora oferece suporte aos principais recursos do Java 8 - comoOptional, APIStream eCompletableFuture.

Neste artigo rápido, veremos alguns exemplos de como podemos usá-los com a estrutura.

2. Optional

Vamos começar com os métodos de repositório CRUD - que agora agrupam os resultados em umOptional:

public interface CrudRepository extends Repository {

    Optional findById(ID id);

}

Ao retornar uma instânciaOptional, é uma dica útil de que existe a possibilidade de que o valor não exista. Mais informações sobre Opcional podem ser encontradashere.

Tudo o que precisamos fazer agora é especificar o tipo de retorno como umOptional:

public interface UserRepository extends JpaRepository {

    Optional findOneByName(String name);

}

3. APIStream

Spring Data também fornece suporte para um dos recursos mais importantes do Java 8 - a APIStream.

No passado, sempre que precisávamos retornar mais de um resultado, precisávamos retornar uma coleção:

public interface UserRepository extends JpaRepository {
    // ...
    List findAll();
    // ...
}

Um dos problemas com essa implementação foi o consumo de memória.

Tivemos que carregar e manter todos os objetos recuperados com entusiasmo.

Poderíamos melhorar aproveitando a paginação:

public interface UserRepository extends JpaRepository {
    // ...
    Page findAll(Pageable pageable);
    // ...
}

Em alguns cenários, isso é suficiente, mas em outros - paginação realmente não é o caminho a percorrer, devido ao grande número de solicitações necessárias para recuperar os dados.

Graças aos provedores Java 8Stream API e JPA - agora podemosdefine that our repository method returns just a Stream of objects:

public interface UserRepository extends JpaRepository {
    // ...
    Stream findAllByName(String name);
    // ...
}

Spring Data usa implementação específica do provedor para transmitir o resultado (Hibernate usaScrollableResultSet, EclipseLink usaScrollableCursor). Reduz a quantidade de consumo de memória e chamadas de consulta para um banco de dados. Por causa disso, também é muito mais rápido do que as duas soluções mencionadas anteriormente.

Processing data with a Stream requires us to close a Stream when we finish it.

Isso pode ser feito chamando o métodoclose() em umStream ou usandotry-with-resources:

try (Stream foundUsersStream
  = userRepository.findAllByName(USER_NAME_ADAM)) {

assertThat(foundUsersStream.count(), equalTo(3l));

We must also remember to call a repository method within a transaction. Caso contrário, teremos uma exceção:

org.springframework.dao.InvalidDataAccessApiUsageException: você está tentando executar um método de consulta de streaming sem uma transação envolvente que mantém a conexão aberta para queStream possa realmente ser consumido. Certifique-se de que o código que consome o fluxo use@Transactional ou qualquer outra forma de declarar uma transação (somente leitura).

4. CompletableFuture

Spring Data repositories can run asynchronously with the support of Java 8’s CompletableFuturee mecanismo Spring para execução de método assíncrono:

@Async
CompletableFuture findOneByStatus(Integer status);

Um cliente que chama esse método retornará um futuro imediatamente, mas um método continuará a execução em um thread diferente.

Mais informações sobre o processamento deCompletableFuture podem ser encontradashere.

5. Conclusão

Neste tutorial, mostramos como os recursos do Java 8 funcionam em conjunto com o Spring Data.

A implementação completa dos exemplos está disponívelover on Github.