web-dev-qa-db-ja.com

Spring Data:JPAリポジトリのfindAll()がListではなく* Mapを返す?

私は次のようなSpring Data JPAリポジトリインターフェイスを持っています。

@Repository
public interface DBReportRepository extends JpaRepository<TransactionModel, Long> {

    List<TransactionModel> findAll();
    List<TransactionModel> findByClientId(Long id);
}

同じことを行うための回避策はありますが、HashMap<K, V>タイプのコレクションが返されますか? Spring Dataクラスを調べましたが、List <>の戻り値以外は見つかりませんでした。

8
Deniss M.

結果をマップに変換するシンプルなワンライナーを作成するより簡単な解決策が見つかるとは思いません。 Java 8ラムダで簡単かつ高速です:

Map<Long, Transaction> transactionMap = transactionList.stream()
         .collect(Collectors.toMap(Transaction::getId, Function.identity()));
13
Patrick

同様のことを解決する必要があり、パトリックスの回答は役に立ちましたが、どこに追加するかを指示することで改善できます。

JPAリポジトリがマップを返すように表示するには、これをリポジトリインターフェースのデフォルトメソッドでラップするように改善します。すべての消費クラスでストリームを実行する必要がなくなります。

@Repository
public interface DBReportRepository extends JpaRepository<TransactionModel, Long> {

    List<TransactionModel> findAll();

    default Map<Long, TransactionModel> findAllMap() {
        return findAll().stream().collect(Collectors.toMap(TransactionModel::getId, v -> v));
    }

    List<TransactionModel> findByClientId(Long id);

    default Map<Long, TransactionModel> findByClientIdMap(Long id) {
        return findByClientId(id).stream().collect(Collectors.toMap(TransactionModel::getId, v -> v));
    }
}
1
Matt R