sql >> Base de Datos >  >> NoSQL >> MongoDB

Spring repository autocasts entidades con diferentes tipos de clase

Para ambos repositorios, puede usar @Query anotación para especificar una cadena de consulta MongoDB JSON que se usará en lugar de la consulta derivada del nombre del método (debe saber que existe una convención para analizar los nombres de los métodos del repositorio y para crear consultas MongoDB).

Entonces, usando @Query , puedes hacer:

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

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

}

Detrás de escena, esto generará una consulta, similar a esta:

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

Sin embargo, hay un problema menor con este código. Si cambia el nombre de clase completo de Manager , entonces la consulta no generaría una RuntimeException , pero no devolvería nada. En este caso, puede usar un comodín dentro de @Query .

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

Luego, cuando invocas el método, puedes simplemente hacer:

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

El Manager.class.getName() proporcionado reemplazará el ?0 comodín y su consulta se construirá correctamente.

Lo mismo ocurre con el Employee repositorio con la diferencia de que debe proporcionar el nombre de clase totalmente calificado de Employee en el @Query value de atributo.

Más información: