sql >> Database teknologi >  >> NoSQL >> MongoDB

Spring repository autocaster enheder med forskellige klassetyper

For begge depoter kan du bruge @Query annotation for at specificere en MongoDB JSON-forespørgselsstreng, der vil blive brugt i stedet for forespørgsel afledt af metodens navn (du skal vide, at der er en konvention for at analysere depotets metodenavne og til at bygge MongoDB-forespørgsler).

Så ved at bruge @Query , kan du gøre:

@Repository
public interface ManagerRepository extends MongoRepository<Employee, String>

  @Query(value="{ '_class' : 'com.igmtechnology.gravity.core.init.test.Manager' }")
  List<Person> findAllManagers();

}

Bag kulisserne vil dette generere en forespørgsel, der ligner denne:

db.person.findAll({'_class' ; 'com.igmtechnology.gravity.core.init.test.Manager'});

Der er dog et mindre problem med denne kode. Hvis du ændrer det fuldt kvalificerede klassenavn for Manager , så ville forespørgslen ikke kaste en RuntimeException , men ville ikke returnere noget. I dette tilfælde kan du bruge et jokertegn i @Query .

@Query(value="{ '_class' : ?0 }")
List<Person> findAllManagers(String className);

Når du derefter påberåber dig metoden, kan du bare gøre:

managerRepository.findAllManagers(Manager.class.getName());

Den angivne Manager.class.getName() erstatter ?0 jokertegn, og din forespørgsel vil blive bygget korrekt.

Det samme gælder for Employee repository med den forskel, at du skal angive det fuldt kvalificerede klassenavn Employee i @Query s value attribut.

Mere info:




  1. Hvordan kan jeg forespørge mongodb ved hjælp af mongoid/skinner uden timeout?

  2. Rekursiv søgning på en samling i MongoDB

  3. Indsæt array, hvor elementet ikke eksisterer, ellers opdatere det (med flere betingelser)

  4. Mongodb, samlet forespørgsel med $lookup