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

Den*_* M. 6 java spring-data spring-data-jpa spring-boot

我有一个Spring Data JPA存储库接口,如下所示:

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

    List<TransactionModel> findAll();
    List<TransactionModel> findByClientId(Long id);
}
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ick 17

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

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


Mat*_*t R 6

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

  • 虽然我认为使用流将列表转换为地图的方法是一种简单而体面的方法,但它不属于存储库。存储库用于 CRUD 和查找器。转变是业务逻辑;因此,它属于服务代码,而不是存储库代码。作为软件开发人员,我们需要实行适当的关注点分离。 (7认同)