
Почему я перестал передавать Spring Pageable в контракты слоя приложения
DmitriiRussuLink 2 минуты назад Почему я перестал передавать Spring Pageable в контракты слоя приложения Простой 4 мин 0 Java * Мнение Из песочницы Контракт use case должен описывать потребность приложения, а не API...
GPT-5.6 31 Temmuz 2026'da yayınlanacak mı?
В сфере искусственного интеллекта произошло заметное событие. DmitriiRussuLink 2 минуты назад Почему я перестал передавать Spring Pageable в контракты слоя приложения Простой 4 мин 0 Java * Мнение Из песочницы Контракт use case должен описывать потребность приложения, а не API выбранного persistence фреймворка. Spring Data пагинация хорошо работает в CRUD приложениях. Для многих проектов Pageable в application service это разумный компромисс.
Проблема возникает, когда Pageable становится частью публичного контракта use Теперь каждый клиент: контроллер, шедулер, message listener, — вынужден знать о Spring Data API. Контракт слоя приложения начинает описывать детали persistence фреймворка, а не потребность приложения. Независимая от фреймворка модель пагинацииPageQuery, PageResult и SortRequest живут в слое приложения.
Технические детали
Никаких зависимостей на Spring Data. Обычные Java records:public record PageQuery(int page, int size, List sort) { public static PageQuery of(int page, int size) { return new PageQuery(page, size, List. of()); } public static PageQuery of(int page, int size, List sort) { return new PageQuery(page, size, sort); } } public record PageResult(List content, int page, int size, long total) {}SortRequest использует доменные имена полей.
Никакого SQL, никаких деталей инфраструктуры:public record SortRequest(String field, Direction direction) { public enum private static final Set ALLOWED_FIELDS = Set. of("id", "name public public static SortRequest asc(String field) { return new SortRequest(field, Direction. ASC); } public static SortRequest desc(String field) { return new SortRequest(field, Direction.
DESC); } }Вызывающий код использует доменный язык. Никакие SQL aliases не проникают в слой приложения:// одно поле PageQuery. asc("name ); // несколько полей PageQuery.
Отраслевые последствия
asc("name SortRequest. desc("id );Контракт репозитория чтения возвращает read model напрямую (CQRS подход), репозиторий намеренно возвращает проекцию, а не агрегат:public interface Инфраструктурный адаптерНа границе инфраструктуры PageQuery конвертируется в SQL параметры. SQL aliases живут здесь и нигде больше.
Слой приложения никогда не видит ни Pageable, ни SQL aliases, ни сырой ResultSet:private static final Map FIELD_MAP = Map. name private static final String SELECT_PAGE = """ SELECT o. name AS owner_name FROM owners o ORDER BY %s LIMIT :limit OFFSET :offset """; @Repository public class JdbcOwnerReadRepository implements OwnerReadRepository { private String buildOrderBy(PageQuery request) { if (request.
isEmpty()) return "o. id ASC"; return request. joining(", ; } @Override public PageResult findAllFlat(PageQuery request) { int offset = request.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





