繁体   English   中英

Map 查询结果到dto

[英]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而言,它被称为投影 或者,您可以将SqlResultSetMappingConstructorResult与 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM