sql >> Databasteknik >  >> NoSQL >> MongoDB

Spring repository autocast-enheter med olika klasstyper

För båda arkiven kan du använda @Query anteckning för att specificera en MongoDB JSON-frågesträng som kommer att användas istället för en fråga som härrör från metodens namn (du måste veta att det finns en konvention för att analysera förvarets metodnamn och för att bygga MongoDB-frågor).

Så genom att använda @Query , kan du göra:

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

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

}

Bakom kulisserna kommer detta att generera en fråga, liknande den här:

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

Det finns dock ett mindre problem med den här koden. Om du ändrar det fullt kvalificerade klassnamnet för Manager , då skulle frågan inte skicka en RuntimeException , men skulle inte returnera något. I det här fallet kan du använda ett jokertecken i @Query .

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

Sedan, när du anropar metoden, kan du bara göra:

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

Den tillhandahållna Manager.class.getName() kommer att ersätta ?0 jokertecken och din fråga kommer att skapas korrekt.

Detsamma gäller för Employee repository med skillnaden att du måste tillhandahålla det fullt kvalificerade klassnamnet för Employee i @Query s value attribut.

Mer information:




  1. Ska jag använda sparse index för booleska flaggor i mongodb?

  2. mongodb jokertecken matchar alla värden för specifik nyckel

  3. MongoDB $lookup pipeline match av _id fungerar inte

  4. Hur man hittar senaste uppdatering/infoga/ta bort operationstid på mongodb-samling utan objektid-fält