[英]Map Query result to dto
我有这 3 个独立的表,即学生、教师和主题。 这里的独立是指这些表中没有关系。
我想要所有这些表的计数。 SQL 查询看起来像 -
SELECT
(SELECT COUNT(*) FROM Student as ST,
(SELECT COUNT(*) FROM Teacher as TE,
(SELECT COUNT(*) FROM Subject as SU
现在我想把 map 这个结果转换成 dto。 DTO 看起来像
public class CountDto{
Integer student;
Integer teacher;
Integer subject;
}
存储库调用看起来像 -
@Query(value = "SELECT\r\n"
+ " (SELECT COUNT(*) FROM Student) as ST, \r\n"
+ " (SELECT COUNT(*) FROM Teacher) as TE,\r\n"
+ " (SELECT COUNT(*) FROM Subject) as SU", nativeQuery = true)
public CountDto getCount();
在调用此 function 时,我收到以下错误说明
"message": "Failed to convert from type [java.lang.Object[]] to type [com.rbl.mdm.dto.CountDto ] for value '{16, 16 , 34}'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [com.rbl.mdm.dto.CountDto]"
我应该如何将我的响应转换为所需的 DTO?
您可以将CountDto
声明为公共接口,它应该可以工作。 就Spring
而言,它被称为投影。 或者,您可以将SqlResultSetMapping或ConstructorResult与 class 一起使用。
您不必通过任何实体 class 来实现它,即使在存储库文件中也只需像独立接口一样创建它:
public interface StudentRepository extends CrudRepository<Student, Long> {
@Query(value = "SELECT\r\n"
+ " (SELECT COUNT(*) FROM Student) as ST, \r\n"
+ " (SELECT COUNT(*) FROM Teacher) as TE,\r\n"
+ " (SELECT COUNT(*) FROM Subject) as SU", nativeQuery = true)
Counts getCount();
public static interface Counts {
Integer getST();
Integer getTE();
Integer getSU();
}
}
所以这是要做的答案 - DTO 看起来像
public CountDto{
private Integer studentTotal;
private Integer teacherTota;
private Integer subjectTotal;
}
存储库调用 -
@Query(value = "SELECT\r\n"
+ " (SELECT COUNT(*) FROM Student) as ST, \r\n"
+ " (SELECT COUNT(*) FROM Teacher) as TE,\r\n"
+ " (SELECT COUNT(*) FROM Subject) as SU", nativeQuery = true)
public Map<String,Integer> getCount();
最后是serviceImpl——
public CountDto getCount{
CountDto CountValue = new CountDto();
Map<String,Integer> map = repository.getCount();
for (Map.Entry<String,Integer> entry : map.entrySet()) {
if(entry.getKey().equals("ST"))
CountValue.setStudentTotal( entry.getValue());
if(entry.getKey().equals("TE"))
CountValue.setTeacherTotal( entry.getValue());
if(entry.getKey().equals("SU"))
CountValue.setSubjectTotal( entry.getValue());
}
return CountValue ;
}
但解决方案对我来说似乎很复杂。 需要任何更简单的方法。
在纯 Hibernate/JPA 使用中,这是一个简单的动态实例化查询(JPA 称之为“构造函数结果”):
select new CountDTO(
(SELECT COUNT(*) FROM Student) as ST,
...
)
这里不知道 Spring,虽然有一点警告......在试图变得有用时,它经常“妨碍”。 不确定这里是不是这种情况...您是否尝试过直接的 Hibernate/JPA?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.