Java 将结果集转换为spring boot 2中的模型
我正试图使用指定的查询来使用Java 将结果集转换为spring boot 2中的模型,java,spring,spring-boot,jpa,Java,Spring,Spring Boot,Jpa,我正试图使用指定的查询来使用@query从数据库中获取数据,但出现了此错误 org.springframework.core.convert.ConverterNotFoundException:未找到能够从类型[org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap]转换为类型[org.closure.gcp.models.UserQueryModel]]的转换器,
@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();
数据库中的结果表如下所示
+------+--------------+
| name | college_name |
+------+--------------+
| cpp | CAE-DU |
| cs | IT-DU |
| java | IT-DU |
+------+--------------+
编辑:
首先在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中添加所有参数构造函数后):
@Query(value=“从用户u内部选择新的.package.UserQueryModel(u.name,c.college\u name)加入大学c ON u.college\u id=c.id按u.name分组”)
列出用户swithcollege();
如果您想使用本机查询,那么您可以这样做
包含对象列表的隐蔽返回类型如下所示
@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();
@Query(value=“选择u.name作为名称,c.college\u name作为学院名称,从用户u内部加入大学c ON u.college\u id=c.id按名称分组”,nativeQuery=true)
列出用户swithcollege();
然后,在您可以在模型中创建构造函数并将对象列表转换为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;
}
公共列表转换模型(列表对象){
列表=新的ArrayList();
用于(最终对象o:对象){
Object[]obj=(Object[])o;
添加(新的UserQueryModel(obj[0].toString(),obj[1].toString());
}
退货清单;
}
有一个正确的答案,我找到了这个方法
回购法
@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();
@Query(value=“选择u.name作为名称,c.college\u name作为学院名称,从用户u内部加入大学c ON u.college\u id=c.id按名称分组”,nativeQuery=true)
列出用户swithcollege();
服务方式
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();
}
公共列表查询服务集合()
{
List List=userRepo.usersWithCollege();
返回list.stream().map((映射器)->{
返回新的UserQueryModel(mapper.get(0),mapper.get(1));
}).toList();
}
但我仍然认为它应该更好这只适用于JPQL,而不是普通SQL。嗯,你是对的,所以也许你必须首先将请求转换为JPQL(不是本机查询)。我觉得没什么大不了的。
@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();
}