Dla obu repozytoriów możesz użyć @Query adnotacja określająca ciąg zapytania MongoDB JSON, który będzie używany zamiast zapytania pochodzącego z nazwy metody (musisz wiedzieć, że istnieje konwencja parsowania nazw metod repozytorium i budowania zapytań MongoDB).
Tak więc, używając @Query , możesz zrobić:
@Repository
public interface ManagerRepository extends MongoRepository<Employee, String>
@Query(value="{ '_class' : 'com.igmtechnology.gravity.core.init.test.Manager' }")
List<Person> findAllManagers();
}
Za kulisami wygeneruje to zapytanie podobne do tego:
db.person.findAll({'_class' ; 'com.igmtechnology.gravity.core.init.test.Manager'});
Jednak z tym kodem jest drobny problem. Jeśli zmienisz w pełni kwalifikowaną nazwę klasy Manager , zapytanie nie wyrzuci RuntimeException , ale nic nie zwrócił. W takim przypadku możesz użyć symbolu wieloznacznego w @Query .
@Query(value="{ '_class' : ?0 }")
List<Person> findAllManagers(String className);
Następnie, po wywołaniu metody, możesz po prostu zrobić:
managerRepository.findAllManagers(Manager.class.getName());
Dostarczony Manager.class.getName() zastąpi ?0 symbol wieloznaczny, a Twoje zapytanie zostanie poprawnie zbudowane.
To samo dotyczy Employee repozytorium z tą różnicą, że musisz podać w pełni kwalifikowaną nazwę klasy Employee w @Query value atrybut.
Więcej informacji: