Лучший способ отобразить результат запроса в DTO - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу сделать сложный запрос и отобразить результат в 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 голосов
/ 21 февраля 2019

Первый аргумент типа для Repository (или JpaRepository) должен быть управляемым объектом.Следовательно, JpaRepository<TotalsDto, Integer> недопустимо, поскольку TotalsDto не является управляемым объектом.Измените TotalsDto на интерфейс проекции, как предложил @MaciejKowalski, а затем передайте сущность JPA в Repository в качестве первого аргумента типа, скажем, Repository<Order, Integer>.

0 голосов
/ 21 февраля 2019

1) Сделать TotalsDto интерфейсом

2) Создать геттеры:

public interface TotalsDto{

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

}

Spring Data Jpa будет автоматически создан/ заполните ваш объект результата.

Подробнее по теме здесь

...