java - 将 native 查询结果投影到 DTO

标签 java hibernate spring-boot jpa

我想将结果映射到数据传输对象,但我不知道解决此问题的正确方法是什么。

由于有很多结果行,如果我解析每个结果行的返回对象并将它们分配给当前创建的数据传输对象,我认为这不是一个很好的解决方案。

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:

引用thisthis答案我应该应用上面提到的解决方案吗?

最佳答案

这应该是你想要的

@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/

相关文章:

java - 超时抛出什么异常?

java - 我可以在 Java 中获取当前引用的名称吗?

java - 在 Android 应用程序中使用 Gmail/Facebook 凭据注册

java - Hibernate不保存复杂对象

java - Maven 存储库有无效的 java.lang.IllegalStateException

java - 由于 "received expired message",无法使用来自 ActiveMQ 的消息

java - 如何使用 Hibernate 创建数据库模式

java - 找不到类型 : java. lang.Short 的 validator

spring-boot - Spring boot - 响应日期格式不正确

node.js - Istio 的 JWT 用户身份验证服务