"Comodo" e "potente da usare" sono obiettivi in una certa misura contraddittori. I repository sono di gran lunga più convenienti dei modelli, ma questi ultimi ovviamente ti danno un controllo più dettagliato su cosa eseguire.
Poiché il modello di programmazione del repository è disponibile per più moduli Spring Data, troverai una documentazione più approfondita nella sezione generale dei documenti di riferimento di Spring Data MongoDB.
TL;DR
In genere consigliamo il seguente approccio:
- Inizia con l'abstract del repository e dichiara semplicemente query semplici utilizzando il meccanismo di derivazione delle query o query definite manualmente.
- Per query più complesse, aggiungi metodi implementati manualmente al repository (come documentato qui). Per l'implementazione usa
MongoTemplate
.
Dettagli
Per il tuo esempio questo sarebbe simile a questo:
-
Definisci un'interfaccia per il tuo codice personalizzato:
interface CustomUserRepository { List<User> yourCustomMethod(); }
-
Aggiungi un'implementazione per questa classe e segui la convenzione di denominazione per assicurarti di poter trovare la 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 } }
-
Ora lascia che l'interfaccia del tuo repository di base estenda quella personalizzata e l'infrastruttura utilizzerà automaticamente la tua implementazione personalizzata:
interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository { }
In questo modo hai essenzialmente la scelta:tutto ciò che è facile dichiarare va in UserRepository
, tutto ciò che è meglio implementato manualmente va in CustomUserRepository
. Le opzioni di personalizzazione sono documentate qui.