sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur ser man repositoryimplementeringen som genereras av Spring Data MongoDB?

tl;dr

Nej, av en mycket enkel anledning:det pågår ingen kodgenerering. Implementeringen baseras på proxyservrar och en metodinterceptor som delegerar samtalsexekveringen till rätt ställen.

Detaljer

Effektivt kan en metodexekvering backas upp av tre typer av kod:

  1. Den butiksspecifika implementeringen av CrudRepository . Titta efter typer som heter Simple(Jpa|Mongo|Neo4|…)Repository (se JPA-specifika här ). De har "riktiga" implementeringar för alla metoder i CrudRepository och PagingAndSortingRepository .

  2. Frågemetoder exekveras effektivt av QueryExecutorMethodInterceptor.doInvoke(…) (se här ). Det är i grunden en 3-stegsprocess för att hitta delegeringsmålet och anropa det. Själva exekveringen görs i klasser som heter (Jpa|Mongo|Neo4j…)QueryExecution (se den här till exempel).

  3. Anpassad implementeringskod anropas direkt, också från QueryExecutorMethodInterceptor .

Det enda som återstår är frågehärledningen, som består av två huvuddelar:metodnamnsanalys och frågeskapande. För det förstnämnda, ta en titt på PartTree . Det kräver ett metodnamn och en bastyp och kommer att returnera dig en tolkad AST-liknande struktur eller skapa ett undantag om det inte lyckas lösa egenskaper eller liknande.

Det senare är implementerat i klasser som heter PartTree(Jpa|Mongo|Neo4j|…)Query och delegerar till ytterligare komponenter för att faktiskt skapa den butiksspecifika frågan. T.ex. för JPA finns de intressanta bitarna förmodligen i JpaQueryCreator.PredicateBuilder.build() (se här ).




  1. Mongo Aggregation

  2. Aggregerat/projekt underdokument som toppnivådokument i mongo

  3. Lägga till värden till en Array i MongoDB med Java

  4. mongodb query vs mysql