Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据:JPA存储库findAll()是否返回*Map而不是List?_Java_Spring Boot_Spring Data_Spring Data Jpa - Fatal编程技术网

Java Spring数据:JPA存储库findAll()是否返回*Map而不是List?

Java Spring数据:JPA存储库findAll()是否返回*Map而不是List?,java,spring-boot,spring-data,spring-data-jpa,Java,Spring Boot,Spring Data,Spring Data Jpa,我有一个Spring数据JPA存储库界面,看起来像这样: @Repository public interface DBReportRepository extends JpaRepository<TransactionModel, Long> { List<TransactionModel> findAll(); List<TransactionModel> findByClientId(Long id); } @存储库 公共接口DBRe

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

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

    List<TransactionModel> findAll();
    List<TransactionModel> findByClientId(Long id);
}
@存储库
公共接口DBReportRepository扩展了JpaRepository{
列出findAll();
列出findByClientId(长id);
}

除了返回类型为
HashMap
的集合外,是否有其他解决方法可以实现相同的效果?我查看了Spring数据类,除了列表返回值之外,找不到任何其他内容

我认为你不会找到一个更简单的解决方案,比如创建一个简单的单行程序来将结果转换为地图。使用java 8 lambdas,它既简单又快速:

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

只是需要解决一些类似的问题,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));
    }
}
@存储库
公共接口DBReportRepository扩展了JpaRepository{
列出findAll();
默认映射findAllMap(){
返回findAll().stream().collect(Collectors.toMap(TransactionModel::getId,v->v));
}
列出findByClientId(长id);
默认映射findByClientIdMap(长id){
返回findByClientId(id).stream().collect(Collectors.toMap(TransactionModel::getId,v->v));
}
}

没有,是什么阻止了你自己这么做?@isah你的意思是自己为spring数据创建这样一个函数?为自己创建这样一个函数我的意思是,无论你在哪里调用这个存储库,加载列表后,你都可以用Java 8一行程序将它映射到
map
。因此@Patrick下面的答案是正确的解决方案。@DenissM.迭代将导致线性时间复杂度,如果您需要访问每个项目,您将得到线性时间复杂度,因此这不是一个问题:虽然我认为使用流将列表转换为地图的方法是一种简单而体面的方法,它不属于存储库。存储库用于CRUD和查找器。转换是业务逻辑;因此,它属于服务代码,而不属于存储库代码。作为软件开发人员,我们需要实践适当的关注点分离。