データ]


1概要

Spring Dataは、

Optional



Stream

API、および

CompletableFuture

など、Java 8のコア機能をサポートするようになりました。

このクイック記事では、これらをフレームワークで使用する方法の例をいくつか紹介します。


2

オプション


CRUDリポジトリメソッドから始めましょう – 結果は

Optional

にラップされます

public interface CrudRepository<T, ID> extends Repository<T, ID> {

    Optional<T> findById(ID id);

}


Optional

インスタンスを返すとき、それは値が存在しないかもしれないという可能性があるという有用なヒントです。 Optionalの詳細については、

here

を参照してください。

返さなければいけないことを

Optional

として指定するだけです。

public interface UserRepository extends JpaRepository<User, Integer> {

    Optional<User> findOneByName(String name);

}


3

Stream

API

Spring Dataは、Java 8の最も重要な機能の1つである

Stream

APIもサポートしています。

以前は、複数の結果を返す必要があるときはいつでも、コレクションを返す必要がありました。

public interface UserRepository extends JpaRepository<User, Integer> {
   //...
    List<User> findAll();
   //...
}

この実装に関する問題の1つはメモリ消費でした。

取得したすべてのオブジェクトを積極的にロードして保持する必要がありました。

ページングを活用することで改善できます。

public interface UserRepository extends JpaRepository<User, Integer> {
   //...
    Page<User> findAll(Pageable pageable);
   //...
}

いくつかのシナリオではそれで十分ですが、他のシナリオでは – データを取得するために必要なリクエスト数が多いため、ページ付けは実際には不可能な方法です。

Java 8

Stream

APIおよびJPAプロバイダのおかげで、リポジトリメソッドがオブジェクトの

Stream

のみを返すように定義できます。

public interface UserRepository extends JpaRepository<User, Integer> {
   //...
    Stream<User> findAllByName(String name);
   //...
}

Spring Dataはプロバイダ固有の実装を使用して結果をストリーミングします(Hibernateは

ScrollableResultSet

を使用し、EclipseLinkは

ScrollableCursor

を使用します)。それはメモリ消費量とデータベースへの問い合わせ呼び出しを減らします。そのため、前述の2つのソリューションよりもはるかに高速です。


  • Stream

    を使用してデータを処理するには、終了時に

    Stream

    を閉じる必要があります** 。

これは、

Stream



close()

メソッドを呼び出すか、または

try-with-resources

を使用して実行できます。

try (Stream<User> foundUsersStream
  = userRepository.findAllByName(USER__NAME__ADAM)) {

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

トランザクション内でリポジトリメソッドを呼び出すことも忘れないでください。そうでなければ、例外が発生します。


stream.springframework.dao.InvalidDataAccessApiUsageException

:

Stream

が実際に消費されるように、接続を開いたままにしてストリーミングクエリメソッドを実行しようとしています。ストリームを消費するコードが

@ Transactional

または(読み取り専用)トランザクションを宣言するその他の方法を使用していることを確認してください。

===

4

CompletableFuture

  • Spring Dataリポジトリは、非同期メソッド実行のためのJava 8の

    CompletableFuture

    ** およびSpringメカニズムのサポートと非同期に実行することができます。

@Async
CompletableFuture<User> findOneByStatus(Integer status);

このメソッドを呼び出すクライアントはただちに未来を返しますが、メソッドは別のスレッドで実行を継続します。


CompletableFuture

処理に関する詳細情報は、

ここ

にあります。

===

5結論

このチュートリアルでは、Java 8の機能とSpring Dataの連携について説明しました。

例の完全な実装はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-jpa[Githubでさらに入手]です。