[英]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.