MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O repositório Spring automaticamente lança entidades com diferentes tipos de classe


Para ambos os repositórios, você pode usar o @Query anotação para especificar uma string de consulta JSON do MongoDB que será usada em vez da consulta derivada do nome do método (você deve saber que há uma convenção para analisar os nomes de métodos do repositório e para criar consultas do MongoDB).

Então, usando @Query , você pode fazer:
@Repository
public interface ManagerRepository extends MongoRepository<Employee, String>

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

}

Nos bastidores, isso gerará uma consulta, semelhante a esta:
db.person.findAll({'_class' ; 'com.igmtechnology.gravity.core.init.test.Manager'});

No entanto, há um pequeno problema com este código. Se você alterar o nome de classe totalmente qualificado de Manager , a consulta não lançaria uma RuntimeException , mas não retornaria nada. Neste caso, você pode usar um curinga dentro do @Query .
@Query(value="{ '_class' : ?0 }")
List<Person> findAllManagers(String className);

Então, quando você invoca o método, você pode simplesmente fazer:
managerRepository.findAllManagers(Manager.class.getName());

O Manager.class.getName() fornecido substituirá o ?0 curinga e sua consulta será construída corretamente.

O mesmo vale para o Employee repositório com a diferença de que você precisa fornecer o nome de classe totalmente qualificado de Employee no @Query value de 's atributo.

Mais informações: