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: