Java 将查询结果映射到dto
我有三个独立的表格,即学生、教师和科目。这里独立指的是这些表中没有关系 我要所有这些桌子的数量。SQL查询看起来像-Java 将查询结果映射到dto,java,spring-boot,dto,Java,Spring Boot,Dto,我有三个独立的表格,即学生、教师和科目。这里独立指的是这些表中没有关系 我要所有这些桌子的数量。SQL查询看起来像- SELECT (SELECT COUNT(*) FROM Student as ST, (SELECT COUNT(*) FROM Teacher as TE, (SELECT COUNT(*) FROM Subject as SU @Query(value = "SELECT\r\n" + " (SELECT CO
SELECT
(SELECT COUNT(*) FROM Student as ST,
(SELECT COUNT(*) FROM Teacher as TE,
(SELECT COUNT(*) FROM Subject as SU
@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();
现在我想把这个结果映射到dto中。
DTO看起来像
public class CountDto{
Integer student;
Integer teacher;
Integer subject;
}
存储库调用看起来像-
SELECT
(SELECT COUNT(*) FROM Student as ST,
(SELECT COUNT(*) FROM Teacher as TE,
(SELECT COUNT(*) FROM Subject as SU
@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();
调用此函数时,我得到以下错误声明
"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声明为公共接口,它应该可以工作。就春天而言,它叫a。或者您可以使用或与您的班级一起使用
您不必通过任何实体类来实现它,只需像在存储库文件中一样创建一个独立的接口:
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,
...
)
我不知道春天的事,不过我要提醒你。。在试图变得有用的过程中,它常常会阻碍我们。不确定这里是不是这样。。。您尝试过直接Hibernate/JPA吗?因为repo调用返回来自3个独立表的数据,我应该进行哪种类型的投影。根据我对预测的理解,它们反映了一个实体的方法,这里我们有3个不同的实体@普密卡我已经更新了我的回答如果你只是想使用SpringAPI,你应该去掉“hibernate”标签。如果只是使用Spring,这里就没有Hibernate相关内容。这种方法只适用于非本机JPQL查询,而OP使用本机查询。不知道@Query是什么。这显然是一个Spring注释:耸耸肩:对于本机查询,甚至更容易@使用@ConstructorResult result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-result-。