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