Мне нужно иметь возможность редактировать объект Pageable, точнее один из сортов.
У меня есть DTO Member
со свойством emailAddress
.Неизвестный клиенту, это информация, которая собирается запросом от 2 разных сущностей, либо Account
, либо Invite
.A Member
всегда имеет один из них.Это работает достаточно хорошо, я делаю стандартный запрос JPA в репо и собираю необходимую информацию перед преобразованием в DTO.
Теперь мы хотим отсортировать этот ссылочный атрибут.Все в порядке.Я могу создать запрос, содержащий что-то вроде ORDER BY coalesce(i.emailAddress, a.emailAddress) ASC
, который работает хорошо.Если клиент не проходит никакой сортировки в объекте Pageable, я просто использую эту сортировку, если клиент проходит сортировку, тогда я вызываю другую версию запроса без этой сортировки по умолчанию.
Но теперь клиентхочет отсортировать это свойство emailAddress
, и проблема начинается.Непосредственная передача Pageable
в Repository
не работает, потому что нет свойства emailAddress
.Так что я думал, не стоит беспокоиться!Давайте просто проверим мой код, если есть сортировка по этому свойству, и сделаем специальную версию моего запроса в зависимости от параметров.
if (pageable.getSort().isSorted()) {
Sort.Order emailAddressOrder = pageable.getSort().getOrderFor("emailAddress");
if (emailAddressOrder != null) {
if (emailAddressOrder.getDirection() == Sort.Direction.ASC)
members = memberRepo.findInProjectDefaultSortAsc(projectId, skipFullName, fullName, pageable);
else
members = memberRepo.findInProjectDefaultSortDesc(projectId, skipFullName, fullName, pageable);
}
else
members = memberRepo.findInProject(projectId, skipFullName, fullName, pageable);
}
else
members = memberRepo.findInProjectDefaultSortAsc(projectId, skipFullName, fullName, pageable);
Не выглядит супер, но должно работать правильно?Неправильно, потому что Pageable
STILL содержит недопустимое свойство emailAddress
.
Так как мне удалить это свойство?Я попытался привести его к PageRequest
, но даже этот объект реализации не доступен для записи.Теперь я сделал следующее:
PageRequest newPageRequest = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize());
И затем я вместо этого передал этот новый объект в запрос.Но это кажется немного подверженным ошибкам, что, если сущность PageRequest будет расширена с дополнительными свойствами позже, тогда мой объект все еще только копирует 2 свойства.Это действительно лучшее, что я могу сделать сейчас?