spring-data-rest возвращает сразу несколько проекций (составьте проекции) - PullRequest
1 голос
/ 13 февраля 2020

Есть ли возможность составить несколько проекций? Это лучший подход для моего варианта использования?

У меня есть следующие проекции для класса CarInBazar, например:

  • SimpleCarInList
  • WidgetForHotSale
  • NumberOfItemViews
  • FullCarData
  • CarMainImage
  • CarMainImageIconSize
  • CarAdditionalImages

И теперь веб-интерфейс создает некоторую страницу пользовательского интерфейса, для чего требуются некоторые из этих проекции.

Должен ли я сделать:

  1. Фронтенд выполнит несколько запросов для одного и того же ресурса с разными проекциями
  2. Реализация проекции для каждого экрана веб-интерфейса (дублирует такие вещи, как NumberOfItemViews расчет, ...)
  3. Используйте наследование и задайте c прогнозы, используя ключевое слово extends. т.е.:
    @Projection(name = "screen-dashboardHome", types = {CarInBazar.class})
    public interface DashboardHomeProjectionForCarInBazar extends SimpleCarInList,
        WidgetForHotSale, CarMainImageIconSize {
    }
Есть ли возможность запросить больше прогнозов одновременно? Возможно, его можно отобразить в пользовательском интерфейсе с использованием предоставленных профилей.

РЕДАКТИРОВАТЬ: в соответствии с запросом, предоставив пример определения проекции:

import org.springframework.data.rest.core.config.Projection;

import java.awt.*;
import java.util.Date;

@Projection(name = "CarMainImage", types = {CarInBazar.class})
public interface CarMainImage {
    Date getLastUpdateDate();

    Image getMainImage();

    default String getMainImageAdditionalInformation() {
        final var updated = this.getLastUpdateDate().getTime();
        final var created = this.getCreatedAtDate().getTime();

        if (created >= (updated - 10 minutes)) {
            return "some business logic on not published fields";
        } else {
            return "could happen not only in spel";
        }
    }
}

Многие проекции не содержат бизнес-логики c и являются только полями фильтрации.

1 Ответ

0 голосов
/ 05 марта 2020

Использование нескольких проекций, кажется, не поддерживается (или широко поддерживается или просто). Используя предложение из комментария @Aivaras, я использовал этот подход:

Код репозитория с пользовательским запросом JPQL:

@Repository
@RepositoryRestResource
@Transactional(readOnly = true)
public interface SomeRepository extends PagingAndSortingRepository<Some, Long> {
    Page<Some> findByNameContaining(String namePart, Pageable pageable);

    @Query("select new sk.qpp.documents.projections.SomeCustomViewByQuery(s.name, s.startDate, s.endDate, s.goLiveDate, 42) from Some s where s.id = :id")
    Optional<SomeCustomViewByQuery> getByIdProjectedForSpecialScreen(Long id);
}

А класс SomeCustomViewByQuery - это просто простая вещь, похожая на DTO. Используя lombok, он может выглядеть следующим образом:

@Value
public class SomeCustomViewByQuery {
    private String name;

    private Date startDate;

    private Date endDate;

    private Date goLiveDate;

    // TODO make SomeHealth to be enum and specific logic behind it.
    String getSomeHealth() {
        final var start = this.getStartDate().getTime();
        final var end = this.getEndDate().getTime();
        final var goLive = this.getGoLiveDate().getTime();
        final var now = System.currentTimeMillis();

        if (now < start) {
            return "not started yet";
        } else {
            if (now < end) {
                return "work in progress";
            } else {
                if (now < goLive) {
                    return "passed end, but before goLive";
                } else {
                    return "something after goLive time";
                }
            }
        }
    }

    private int unicornsCount;
}

Таким образом, я могу сделать ручной запрос (JQPL), а также создать собственный экземпляр DTO. Это удобно, когда мне нужно сделать несколько объединений с другими таблицами с агрегацией (count, avg, max, min, ...) и другими вещами, которые лучше делать на стороне базы данных.

...