将查询结果映射到DTO的最佳方法

时间:2019-02-21 10:42:03

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

我想进行一个复杂的查询并将结果映射到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...)

2 个答案:

答案 0 :(得分:3)

1)使TotalsDto成为界面

2)创建吸气剂:

public interface TotalsDto{

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

}

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

有关here主题的更多信息

答案 1 :(得分:1)

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