Spring 数据:JPA 存储库 findAll() 到 return *映射而不是列表?

Spring Data: JPA repository findAll() to return *Map instead of List?

我有一个 Spring Data JPA 存储库界面,看起来像这样:

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

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

是否有一种变通方法可以使集合成为 return 类型的 HashMap<K, V>?我查看了 Spring 数据 类,除了 List<> return 值之外找不到任何其他内容。

我认为您不会找到更简单的解决方案来创建一个简单的单线来将您的结果转换为地图。使用 java 8 个 lambdas:

既简单又快速
Map<Long, Transaction> transactionMap = transactionList.stream()
         .collect(Collectors.toMap(Transaction::getId, Function.identity()));

刚刚不得不解决类似的问题,帕特里克的回答有所帮助,但可以通过指出添加位置来改进。

为了使它看起来像 JPA 存储库 returns 映射,一项改进是将其包装在存储库界面中的默认方法中。节省您必须在所有消耗 类.

中执行流
@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));
    }
}

另一个解决方案使用 java 8 个 lambda:

使用 Collectors 的 groupingBy 方法按 ID 对 transactionList 进行分组并将结果存储在 Map 实例中

Map<Long, Transaction> transactionMap = transactionList.stream().collect(Collectors.groupingBy(v->v.getId()));