"Conveniente" e "poderoso de usar" são objetivos contraditórios até certo ponto. Os repositórios são muito mais convenientes do que os modelos, mas o último, obviamente, oferece um controle mais refinado sobre o que executar.
Como o modelo de programação do repositório está disponível para vários módulos Spring Data, você encontrará uma documentação mais detalhada para ele na seção geral dos documentos de referência do Spring Data MongoDB.
TL;DR
Geralmente, recomendamos a seguinte abordagem:
- Comece com o resumo do repositório e apenas declare consultas simples usando o mecanismo de derivação de consulta ou consultas definidas manualmente.
- Para consultas mais complexas, adicione métodos implementados manualmente ao repositório (conforme documentado aqui). Para a implementação use
MongoTemplate
.
Detalhes
Para o seu exemplo, ficaria algo assim:
-
Defina uma interface para seu código personalizado:
interface CustomUserRepository { List<User> yourCustomMethod(); }
-
Adicione uma implementação para essa classe e siga a convenção de nomenclatura para garantir que possamos encontrar a classe.
class UserRepositoryImpl implements CustomUserRepository { private final MongoOperations operations; @Autowired public UserRepositoryImpl(MongoOperations operations) { Assert.notNull(operations, "MongoOperations must not be null!"); this.operations = operations; } public List<User> yourCustomMethod() { // custom implementation here } }
-
Agora, deixe sua interface de repositório base estender a interface personalizada e a infraestrutura usará automaticamente sua implementação personalizada:
interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository { }
Dessa forma, você basicamente tem a escolha:tudo o que é fácil de declarar vai para
UserRepository
, tudo o que é melhor implementado manualmente vai para CustomUserRepository
. As opções de personalização estão documentadas aqui.