【问题标题】:How to assign Resultset Jpa to Hashmap如何将Resultset Jpa分配给Hashmap
【发布时间】:2021-11-15 05:07:37
【问题描述】:

您好,我在接口ComComuneRepository < extends JpaRepository>中有当前代码

@Query(value = "SELECT COM_PRG_PK, COM_DESCRIZIONE FROM com_comune  ORDER BY 
                    com_descrizione", nativeQuery = true)
HashMap <Long, String> findAllComuneIdAndDescrizione();

无论如何,它会引发错误,因为 JPA 不会自动理解我想将 Com_Prg_Pk 分配给 Long 并将 Com_Descrizione 分配给 String。

如何使用JpaRepository 做到这一点?

【问题讨论】:

  • 这能回答你的问题吗? How to return HashMap from JPA query?
  • @İsmail Y. 我尝试了这种方法,但阻止我的是我不明白如何正确初始化 EntityManager,因为我使用的是 JPA ,而不是标准的 Dao
  • 您实际上可以通过简单易懂的方式做您想做的事情,如参考中所述。只需将SELECT COM_PRG_PK, COM_DESCRIZIONE FROM com_comune ... 替换为SELECT new map(c.COM_PRG_PK, c.COM_DESCRIZIONE) FROM com_comune c ORDER BY c.com_descrizione

标签: java sql spring jpa hashmap


【解决方案1】:

从JPA 2.2版本开始,可以使用getResultStream Query方法将List结果转化为Map

Map<Long, String> findAllComuneIdAndDescrizione = entityManager.createQuery("""
    SELECT COM_PRG_PK, COM_DESCRIZIONE FROM com_comune  ORDER BY 
                com_descrizione
    """, Tuple.class)
.getResultStream()
.collect(
    Collectors.toMap(
        tuple -> ((Long) tuple.get("COM_PRG_PK")).longValue(),
        tuple -> ((String)tuple.get("COM_DESCRIZIONE")).stringValue()
    )
);

或者...以下存储库类可能会给您一个想法

@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));
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 2012-01-13
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2014-06-05
    相关资源
    最近更新 更多