Как вернуть пользовательский класс из PagingAndSortingRepository в Spring Boot

У меня есть модель, которая выглядит так:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Sale {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @OneToOne(targetEntity = User.class)
  private User customer;

  @OneToOne(targetEntity = Product.class)
  private Product product;
}

И у меня есть репозиторий для подкачки и сортировки, например:

public interface SaleRepository extends PagingAndSortingRepository<Sale, Long> {}

Но я хотел бы, чтобы метод репозитория «findAll» возвращал пользовательский класс с определенными полями (вместо всех данных вложенных сущностей), сохраняя при этом возможности подкачки и сортировки. Список объектов, которые я хотел бы вернуть, будет содержать что-то вроде:

  • идентификатор продажи
  • Пользовательский ИД
  • имя покупателя
  • идантификационный номер продукта
  • Наименование товара
  • цена продукта

Но я не уверен, как на самом деле это сделать.

Мой метод контроллера принимает параметры сортировки и разбиения по страницам, а затем делает следующее:

Page<Sale> saleList = saleRepository.findAll(pageable);

return saleList;
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
414
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать либо интерфейс, либо DTO и использовать его как результат поиска, объявленного в вашем репозитории:

Page<YourDTO> findAllAsDtos(Pageable pageable);

Подробнее о прогнозах читайте здесь: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

Спасибо Саймон. Я раньше не видел такого подхода, кажется, это самый простой и простой способ сделать это. Ваше здоровье!

simbro 28.05.2019 17:08

Возможно, вам следует прочитать всю справочную документацию Spring Data JPA. Есть и другие скрытые жемчужины.

Simon Martinelli 28.05.2019 17:10

Другие вопросы по теме