'Handig' en 'krachtig in gebruik' zijn in zekere mate tegenstrijdige doelen. Opslagplaatsen zijn veel handiger dan sjablonen, maar de laatste geven u natuurlijk meer gedetailleerde controle over wat u moet uitvoeren.
Aangezien het repository-programmeermodel beschikbaar is voor meerdere Spring Data-modules, vindt u meer diepgaande documentatie hierover in het algemene gedeelte van de Spring Data MongoDB-referentiedocumenten.
TL;DR
Over het algemeen raden we de volgende aanpak aan:
- Begin met de samenvatting van de repository en declareer eenvoudige zoekopdrachten met behulp van het mechanisme voor het afleiden van zoekopdrachten of handmatig gedefinieerde zoekopdrachten.
- Voor complexere zoekopdrachten voegt u handmatig geïmplementeerde methoden toe aan de repository (zoals hier beschreven). Gebruik voor de implementatie
MongoTemplate
.
Details
Voor jouw voorbeeld zou dit er ongeveer zo uitzien:
-
Definieer een interface voor uw aangepaste code:
interface CustomUserRepository { List<User> yourCustomMethod(); }
-
Voeg een implementatie toe voor deze klasse en volg de naamgevingsconventie om ervoor te zorgen dat we de klasse kunnen vinden.
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 } }
-
Laat uw basisrepository-interface nu de aangepaste uitbreiden en de infrastructuur zal automatisch uw aangepaste implementatie gebruiken:
interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository { }
Op deze manier krijg je in wezen de keuze:alles wat eenvoudig te declareren is, gaat in UserRepository
, alles wat beter handmatig kan worden geïmplementeerd, gaat naar CustomUserRepository
. De aanpassingsopties worden hier gedocumenteerd.