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: