簡體   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