我想将结果映射到数据传输对象,但我不知道解决此问题的正确方法是什么。
由于有很多结果行,如果我解析每个结果行的返回对象并将它们分配给当前创建的数据传输对象,我认为这不是一个很好的解决方案。
public class MaintenanceTaskRepositoryImpl implements CustomMaintenanceTaskRepository {
@Autowired
EntityManager em;
@Override
public List<Object []> findRepairCostForLast5Year() {
List<Object []> results = em.createNativeQuery(
"SELECT YEAR(END_DATE) AS YEAR," +
" SUM(PRICE) AS REPAIR_COST" +
" FROM MAINTENANCE_TASK" +
" WHERE TYPE_OF_WORK = 'PREVENTIVE' AND" +
" DATEDIFF(YEAR, END_DATE , CURRENT_DATE) < 6" +
" GROUP BY YEAR(END_DATE) " +
" LIMIT 5").getResultList();
return results;
}}
上面的查询返回多行,这就是它是对象数组列表的原因。 它现在可以工作,但我希望我的方法直接返回 DTO 列表。
我的 DTO 类如下。
public class RepairCostDto {
private int year;
private BigDecimal cost;
public RepairCostDto(int year, BigDecimal cost) {
this.year = year;
this.cost = cost;
}
public RepairCostDto() {
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public BigDecimal getCost() {
return cost;
}
public void setCost(BigDecimal cost) {
this.cost = cost;
}}
提前谢谢您。
编辑:
上面的返回就像,
[[year,cost],[year1,cost1],[year2,cost2]]
但我想要如下所示,
[RepairCostObj,RepairCostObj1, RepairCostObj2...]
编辑2:
最佳答案
这应该是你想要的
@PersistenceContext
private EntityManager entityManager;
@Transactional
public List<RepairCostDto> listRepairCost(){
String sql = "xxxxxxxx";
SQLQuery sqlQuery = entityManager.createNativeQuery(sql).unwrap(SQLQuery.class);
Query query = sqlQuery.setResultTransformer(Transformers.aliasToBean(RepairCostDto.class));
List<RepairCostDto> list = query.list();
entityManager.clear();
return list;
}
此外,我认为规范将是更好的方法。
关于java - 将 native 查询结果投影到 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55269826/