【问题标题】:convert resultset to model in spring boot 2在 Spring Boot 2 中将结果集转换为模型
【发布时间】:2021-06-11 13:33:35
【问题描述】:

我正在尝试使用指定的查询使用 @Query 从数据库中获取数据,但我收到此错误

org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型 [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] 转换为类型 [org.closure.gcp.models .UserQueryModel]] 有根本原因

如何将此查询的结果转换为我的模型?

我的存储库中的查询方法

@Query(value = "select u.name as name,c.college_name as college_name from users u inner join college c ON u.college_id = c.id GROUP BY name", nativeQuery = true)
   List<UserQueryModel> usersWithCollege(); 

模型类

public class UserQueryModel {

    private String name;
    private String college_name;
    //getters setters
} 

数据库中的结果表会是这样的

+------+--------------+
| name | college_name |
+------+--------------+
| cpp  | CAE-DU       |
| cs   | IT-DU        |
| java | IT-DU        |
+------+--------------+

【问题讨论】:

    标签: java spring spring-boot jpa


    【解决方案1】:

    如果你想使用原生查询,那么你可以这样做。

    带有对象列表的隐蔽返回类型如下所示,

    @Query(value = "select u.name as name,c.college_name as college_name from users u inner join college c ON u.college_id = c.id GROUP BY name", nativeQuery = true)
    List<Object> usersWithCollege(); 
    

    然后,您可以在模型中创建构造函数并将对象列表隐藏到您的 Pojo 中,

    public List<UserQueryModel> convertToModel(List<Object> object) {
        List<UserQueryModel> list = new ArrayList<UserQueryModel>();        
        for(final Object o : object) {
            Object[] obj = (Object[]) o;
            list.add(new UserQueryModel(obj[0].toString(), obj[1].toString()));
        }
        return list;
    }
    

    【讨论】:

      【解决方案2】:

      Pankaj 有一个正确的答案,我找到了这种方法。

      回购方法

      @Query(value = "select u.name as name,c.college_name as college_name from users u inner join college c ON u.college_id = c.id GROUP BY name", nativeQuery = true)
          List<List<String>> usersWithCollege();
      

      服务方式

      public List<UserQueryModel> queryUsersCollege()
          {
              List<List<String>> list = userRepo.usersWithCollege();
              return list.stream().map((mapper)->{
                  return new UserQueryModel(mapper.get(0),mapper.get(1));
              }).toList();
          }
      

      但我仍然认为应该更好

      【讨论】:

        【解决方案3】:

        编辑: 首先在 JPQL 中转换您的请求,它可能看起来像这样:

        select u.name, c.college_name from User u inner join College c ON u.college_id = c.id GROUP BY u.name
        

        然后构造新对象,就可以了(在UserQueryModel中添加所有args构造函数后):

        @Query(value = "select new your.package.UserQueryModel(u.name,c.college_name) from User u inner join College c ON u.college_id = c.id GROUP BY u.name")
           List<UserQueryModel> usersWithCollege(); 
        
        

        【讨论】:

        • 这仅适用于JPQL纯SQL。
        • 嗯,你是对的,所以也许你必须首先将请求转换为 JPQL(不是原生查询)。我认为这没什么大不了的。
        猜你喜欢
        • 1970-01-01
        • 2018-12-17
        • 2020-11-10
        • 2018-04-04
        • 2019-05-17
        • 1970-01-01
        • 2018-01-04
        • 2016-12-30
        • 1970-01-01
        相关资源
        最近更新 更多