Использование нескольких проекций, кажется, не поддерживается (или широко поддерживается или просто). Используя предложение из комментария @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, ...) и другими вещами, которые лучше делать на стороне базы данных.