Spring Data: JPA repository findAll() 返回 *Map 而不是 List?

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

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

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

有没有一种解决方法可以使相同,但要返回类型的集合?我查看了Spring Data类,除了List<>返回值之外找不到其他任何东西。HashMap<K, V>


答案 1

我不认为你会找到一个更简单的解决方案,创建一个简单的衬里将你的结果转换为地图。使用java 8 lambdas简单而快速:

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

答案 2

只是必须解决类似的事情,Patricks的答案有所帮助,但可以通过指示添加位置来改进。

为了使它看起来像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));
    }
}

推荐