Как редактировать объект Spring Pageable? - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужно иметь возможность редактировать объект 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 свойства.Это действительно лучшее, что я могу сделать сейчас?

1 Ответ

0 голосов
/ 11 декабря 2018

Да, не волнуйся.В вашем подходе нет ничего плохого.Pageable / PageRequest являются неизменными, и это на самом деле хорошая практика.При работе с неизменяемыми классами принято создавать копии с (возможно) измененными свойствами.

Кроме того, не беспокойтесь о будущем.Если в будущем сущность PageRequest будет расширена, разработчики Spring почти наверняка сохранят ее неизменной.В методе конструктор / фабрика появится новый параметр, который приведет к ошибке компиляции.Получение такой ошибки - лучшее, что может случиться при обновлении версии библиотеки.

Редактировать: У вас есть еще одна дополнительная опция: не вставлять Sort в Pageable,Используйте их как два отдельных параметра.Первый параметр будет Pageable без какой-либо информации о сортировке.Вторым параметром может быть Spring 101 *, но вы также можете использовать свои собственные типы данных, например, enum.

...