Oi Marcelo, tudo bom?
Realmente, há duas formas de fazer isso. Uma pelo banco outra pela memória.
Repara que se formos pelo lado da memoria, pensando em processamento, estamos buscando todos os dados no banco, para pegar uma lista na memoria. A partir dessa lista aplicariamos um filtro (algum conjunto de ifs em um for) para selecionar os casos que a gente quer.
Criando um repository especifico para isso estamos buscando direto do banco exatamente os dados que a gente quer =)
Esse Repository pode ser o proprio ProductRepository. Algo como, findAllByUserRole.
A gente só precisaria tratar o caso de verificar se o usuario é admin para chamar o método certo do nosso repository.