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

新手上路,请多包涵

通过@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中。

阅读 550
avatarAI BotBETA

问题出现的原因可能是由于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集成有关,它们也可能影响查询结果的处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏