当前位置: 首页 > 知识库问答 >
问题:

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

江亮
2023-03-14

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

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

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

除了返回类型为HashMap的集合之外,是否有其他解决方法可以实现相同的效果

共有3个答案

钱建本
2023-03-14

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

使用收集器的groupingBy方法按ID对transactionList进行分组,并将结果存储在映射实例中

Map<Long, Transaction> transactionMap = transactionList.stream().collect(Collectors.groupingBy(v->v.getId()));
司徒俊雄
2023-03-14

只是需要解决一些类似的问题,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));
    }
}
楚雪松
2023-03-14

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

Map<Long, Transaction> transactionMap = transactionList.stream()
         .collect(Collectors.toMap(Transaction::getId, Function.identity()));
 类似资料:
  • 我有这样的查询,我想从中提取电影标题及其评级 但此列表显然不能存储具有2个值的结果集 在了解它之后,我发现例如这个链接Spring Data: JPA repository findAll()返回*Map而不是List?但我似乎不清楚它们的实现。 我不明白他们从哪里得到第一个链接中的长值 我如何创建我的地图? 电影类: 评级等级:

  • 我已经实现了JWT认证和授权。一切都很好,除了未经授权的场景 未经授权的情况:在不提供授权令牌的情况下对路由进行http调用。 结果:禁止403例,未批准403例 以下是我的完整课程: 备注: 我在UsernamePasswordAuthenticationFilter中遇到了同样的问题,我通过重写默认的AuthenticationFailureHandler解决了这个问题:

  • 问题内容: 我的代码中有一个,如果地图的方法返回的是空列表而不是空值,则应避免使用空指针。java API中是否有类似的东西?我应该延长吗? 问题答案: @Jon的答案是直接处理您所要询问的好方法。 但是令我惊讶的是,您可能要实现的是“多图”;即从键到值集合的映射。如果是这种情况,那么您还应该查看Guava或Apache commons集合中的multimap类。 看着: 界面和它的实施方式中,或

  • 我试图让2支球队互相比赛。当我说团队1.玩(团队2)时,我称之为;当 i 生成的数字小于 0.5 时,team2 应获胜,如果大于 0.5,则团队 1 应获胜。当团队 1 获胜时,它会正确显示为尼克斯,但当团队 2 获胜时,它会显示内存地址。我怎么能让它正确地说网是赢的,而不是team@78987neu73

  • 问题内容: hibernate命名查询为数据类型为NUMBER的列返回BigDecimal。 在客户端,我希望col1的数据类型很长(原始),我这样做: 要么 在两种情况下,我得到: 我怎样才能解决这个问题?我怀疑,混叠有问题吗? 问题答案: 默认情况下,Oracle NUMBER映射到Hibernate中的BigDecimal。尝试将类型设置为BigDecimal。

  • 问题内容: 搜索时,Elasticsearch返回包含各种元信息的数据结构。 实际结果集包含在从数据库返回的JSON结果内的“ hits”字段中。 Elasticsearch是否有可能仅返回所需的数据(然后是“ hits”字段的内容)而没有嵌入所有其他元数据中? 我知道我可以将结果解析为JSON并提取出来,但是我不希望复杂性,麻烦和性能下降。 谢谢! 这是Elasticsearch返回的数据结构的