【问题标题】:Best way to map query result to DTO将查询结果映射到 DTO 的最佳方法
【发布时间】:2019-07-15 06:02:00
【问题描述】:

我想进行复杂的查询并将结果映射到 DTO。 DTO 如下:

@Value(staticConstructor = "of")
public class TotalsDto {
    LocalDate date;
    long totals;
    long totalPerCategory;
    int categoryId;
    String categoryName;
}

我的存储库接口是从JpaRepository 扩展而来的。这是抛出一个IllegalArgumentException: Not a managed type,因为TotalsDto 本身不是实体。

存储库是:

@Repository
public interface TotalsRepository extends JpaRepository<TotalsDto, Integer> { 

    @Query(value = "SELECT ...", nativeQuery = true)
    List<TotalsDto> getTotals(params...);
}

查询正在从其他实体获取数据以构建 DTO。 有什么方法可以将每一列映射到 DTO?我试图用下面的查询映射它,但它仍然得到Not a managed class

SELECT my.package.TotalsDto.of(column1, subqueryResult1, subqueryResult2...)

【问题讨论】:

标签: java spring jpa spring-data-jpa spring-data


【解决方案1】:

1)TotalsDto 设为接口

2) 创建 getter:

public interface TotalsDto{

    long getTotals();
    int getCategoryId();
    ...

}

Spring Data Jpa 将自动创建/填充您的结果对象。

更多关于主题here

【讨论】:

  • 仍然收到Not a managed type。如您发送的链接中所述,我还将存储库父级更改为org.springframework.data.repository.Repository,但出现相同的错误。
  • 这里也一样,要么缺少文档,要么我们很愚蠢——你有没有搞定@Leonardo?
【解决方案2】:

Repository(或JpaRepository)的第一个类型参数必须是托管实体。因此,JpaRepository&lt;TotalsDto, Integer&gt; 无效,因为TotalsDto 不是托管实体。将TotalsDto 更改为@MaciejKowalski 建议的投影接口,然后将JPA 实体作为第一个类型参数传递给Repository,例如Repository&lt;Order, Integer&gt;

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2019-07-25
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多