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

时间:2017-01-26 14:48:53

标签: java spring-boot spring-data spring-data-jpa

我有一个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&lt;&gt;之外找不到任何其他内容。返回值。

3 个答案:

答案 0 :(得分:14)

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

trait A 
trait B { myVar: A => }

答案 1 :(得分:3)

只需解决类似的问题,帕特里克(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));
    }
}

答案 2 :(得分:0)

另一种使用 java 8 lambdas 的解决方案:

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

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