sql >> Database >  >> NoSQL >> MongoDB

Spring repository cast automatisch entiteiten met verschillende klassentypen

Voor beide repositories kunt u de @Query . gebruiken annotatie om een ​​MongoDB JSON-querystring op te geven die zal worden gebruikt in plaats van een query die is afgeleid van de naam van de methode (u moet weten dat er een conventie is voor het ontleden van de methodenamen van de repository en voor het bouwen van MongoDB-query's).

Dus, door @Query . te gebruiken , je kunt het volgende doen:

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

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

}

Achter de schermen zal dit een zoekopdracht genereren, vergelijkbaar met deze:

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

Er is echter een klein probleempje met deze code. Als je de volledig gekwalificeerde klasnaam van Manager wijzigt , dan zou de query geen RuntimeException . genereren , maar zou niets teruggeven. In dit geval kunt u een jokerteken gebruiken binnen de @Query .

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

Als u de methode vervolgens aanroept, kunt u het volgende doen:

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

De verstrekte Manager.class.getName() vervangt de ?0 jokerteken en uw zoekopdracht wordt correct opgebouwd.

Hetzelfde geldt voor de Employee repository met het verschil dat u de volledig gekwalificeerde klassenaam van Employee moet opgeven in de @Query 's value attribuut.

Meer info:




  1. Heroku Redis - GUI en geheugenoptimalisatie

  2. limieten van het aantal collecties in databases

  3. MongoDB:invoegen bij dubbele sleutelupdate

  4. Azure Redis-cache - time-outs bij GET-aanroepen