Criar método estático auxiliar para gerar nova lista de entidades ordenada
Como sabemos que o "page" está ordenado, a ideia é criar um método para fazer o seguinte:
Iremos gerar uma nova lista, usando os objetos da lista não ordenada (entities), obedecendo à ordenação da ordenada (page).
Criar um pacote util e a classe "utils".
public class Utils {
//pegaremos a ordenação de projection (paginação) e montar uma nova lista de Product
//usando como a base a lista desordenada (entity)
public static List<Product> replace(List<ProductProjection> ordered, List<Product> unordered) {
//Usar Map, pois é mais fácil para acessar os itens.
//Long (para o id), guardaremos o product pelo ID.
Map<Long, Product> map = new HashMap<>();
//preenchendo o Map com os elementos da lista desordenada
for (Product p : unordered) {
map.put(p.getId(), p);
}
//criando lista de Produtos ordenada
List<Product> result = new ArrayList<Product>();
//agora, para cada Projection da ordered (lá em cima), iremos adicionar na result
//o produto que corresponde a Projection
for (ProductProjection p : ordered) {
//irá para a lista, o produto que o id estiver no map, que tenha o ID do
//objeto dentro da lista ordered
result.add(map.get(p.getId()));
}
return result;
}
}
Ok, perfeito! A partir disso, poderemos fazer a requisição e virá em ordem alfabética ou por ID.
Só tem um porém. Fizemos a resolução se baseando num tipo de ProductProjection. E se fosse outro tipo? UserProjection e User? Não tem porque reescrever o código. Deixaremos no próximo passo o método mais genérico ➡️