Java 将查询结果映射到dto

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

我有三个独立的表格,即学生、教师和科目。这里独立指的是这些表中没有关系

我要所有这些桌子的数量。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 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-。