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

spring-data-jpa - 通过@Query注解将查询结果封装进List<Map<String,Integer>>发生错误?

梁丘逸仙
2024-08-23

通过@Query注解将查询结果封装进List<Map<>>发生错误,提示无法将String类型转换成Integer类型,我觉得可能是将原本希望封装到key的值装到了value中,所以报错,于是将sql语句中的两个字段互换位置,结果报错信息一样。又尝试将Map<>中key和value的类型都改为String,结果提示有重复的key值(还是将child_count字段往key中装)。

@Query(value = "SELECT " +
            "p.id AS id, COUNT(c.id) AS childCount " +
            "FROM " +
            "t_sd_device p " +
            "LEFT JOIN " +
            "t_sd_device c ON p.device_code = c.parent_code\n" +
            "WHERE \n" +
            "    p.parent_code IS NULL\n" +
            "GROUP BY \n" +
            "    p.id", nativeQuery = true)
    List<Map<String,Integer>> getChildCount();

希望能将查出来的id装入Map<>集合的key中,child_count装入Map<>集合的value中。

共有1个答案

尚棋
2024-08-23

问题出现的原因可能是由于Spring Data JPA或Hibernate在处理@Query注解的native SQL查询时,对于将结果集映射到List<Map<String, Integer>>类型的处理方式。通常,当你使用List<Map<String, ?>>这样的类型时,框架会自动将SQL查询的列名作为Map的key,将对应的值作为Map的value。

在你的SQL查询中,你已经明确地将p.id列别名为id,将COUNT(c.id)列别名为childCount。理论上,这应该会正确地映射到Map中,其中id为key,childCount的值(类型为Integer)为value。

然而,如果仍然出现类型错误(如无法将String转换为Integer),这通常表明在映射过程中可能存在其他配置或环境问题。这里有几个可能的解决方案和检查点:

  1. 确保SQL查询正确:首先确认SQL查询本身在数据库中是正确的,并且返回了你预期的数据类型和列名。
  2. 检查JPA/Hibernate版本:有时候,不同的JPA或Hibernate版本在处理native SQL查询的结果映射时可能会有不同的行为。确保你使用的版本是稳定的,或者查阅该版本的文档以了解是否有相关的已知问题或限制。
  3. 使用ResultTransformer(Hibernate特有):如果你使用的是Hibernate作为JPA提供商,可以尝试使用ResultTransformer来自定义结果集的映射方式。然而,这种方法通常是在不使用@Query注解时使用的,而是直接在查询时指定。
  4. 使用DTO(数据传输对象):考虑定义一个DTO类来封装查询结果,而不是使用Map。这样你可以更精确地控制每个字段的类型和映射。

    public class DeviceChildCountDTO {
        private Long id;
        private Integer childCount;
    
        // getters and setters
    }
    
    @Query(value = "你的SQL查询", nativeQuery = true)
    List<DeviceChildCountDTO> getChildCount();

注意:你需要使用@SqlResultSetMapping@ConstructorResult(或@EntityResult,如果你的DTO与实体类相似)来映射DTO的字段,但这通常用于JPQL查询,而不是native SQL。对于native SQL,你可能需要使用Spring Data JPA的自定义查询和ResultTransformer(如果可用)或直接在服务层处理结果集。

  1. 检查查询执行和结果处理代码:确保在调用getChildCount()方法后,没有代码错误地将结果集中的值转换为不兼容的类型。
  2. 查看日志和异常堆栈:详细查看应用程序的日志和异常堆栈跟踪,以获取更多关于错误发生位置的线索。

如果上述方法都不能解决问题,建议查看Spring Data JPA或Hibernate的官方文档,或在相关社区和论坛中搜索类似的问题。此外,检查是否有其他库或框架(如Spring Boot的版本)与你的JPA/Hibernate集成有关,它们也可能影响查询结果的处理。

 类似资料:
  • 本文向大家介绍详解Spring Data JPA使用@Query注解(Using @Query),包括了详解Spring Data JPA使用@Query注解(Using @Query)的使用技巧和注意事项,需要的朋友参考一下 经过几天的折腾,终于到了学习一个重量级的查询方式上,使用@Query注解,使用注解有两种方式,一种是JPQL的SQL语言方式,一种是原生SQL的语言,略有区别,后者我们更熟

  • 问题内容: 我可以使用Spring Data JPA 进行示例查询,其中将特定的实体实例用作搜索条件? 例如(如果没有双关语),如果我有一个看起来像的实体: 我可以找到所有出生于1977年1月1日的姓史密斯的受雇者,并举一个例子: 问题答案: Spring数据依赖于JPA和EntityManager,而不依赖于Hibernate和Session,因此,您没有开箱即用的findByExample。您

  • 我有一个问题,就是对数据库的查询不能得到正确的结果。 在带有此查询的工作台中:

  • 存储库接口: 当我运行调用本机查询的endpoint时,我得到异常: 无法将值“{0,198}”从类型[java.lang.Object[]]转换为类型[com.representation.representation];嵌套异常为org.springframework.core.convert.converterNotFoundException:未找到能够从类型[java.math.BigD

  • 此外,该实体需要一个id,我希望让jpa自动生成它,但我得到的是“Invalid Parameter:Unknown column name id.errorcode=-4460,sqlstate=null” 我的结果集包含4个相同的记录,而不是4个不同的记录,我认为这与我的id字段设置不正确有关 如果你能在这方面提供帮助,我将不胜感激,谢谢。

  • 下面是一个存储库,其中包含了这个问题中的代码来排除bug:https://github.com/agsimeonov/stream-bug 我一直试图用Spring Data、JPA和Hibernate使用以下代码(Data.txt是一个有3000行的文件,每行都有一个数字)流式传输查询结果: 下面是域对象: 我肯定知道几件事: 首先-此bug与底层数据库无关。当我在使用Postgres的示例项目

  • 关于注释和注释,我遇到了一个有趣的问题在Spring Boot项目上,spring data jpa也在项目中。 基本上,我有软删除机制,这是为实体设置一个有效的日期(例如属性列在实体类中带有属性)。这些实体用注释类似于。这样,将设置为now和before的软删除的实体自动删除。(例如实体类) 我还有一些其他实体没有(例如实体类) 以及其他一些可用的表。如果是Jpa查询带注释的方法。我正面临着一些

  • 我使用Spring数据JPA和Spring Boot应用程序。我有一个属性很少的实体类。假设我有10个属性与实体关联,我只想检索其中的几个(用户名、密码、名字、名字、电子邮件)。 因此,我编写了一个查询,只获取5个字段,但该方法不返回实体对象,而是返回一个普通对象。 如何将查询结果转换为Spring Data JPA中的实体?