И за двете хранилища можете да използвате @Query
анотация, за да посочите MongoDB JSON низ на заявка, който ще се използва вместо заявка, получена от името на метода (трябва да знаете, че има конвенция за анализиране на имената на методите на хранилището и за изграждане на MongoDB заявки).
И така, с помощта на @Query
, можете да направите:
@Repository
public interface ManagerRepository extends MongoRepository<Employee, String>
@Query(value="{ '_class' : 'com.igmtechnology.gravity.core.init.test.Manager' }")
List<Person> findAllManagers();
}
Зад кулисите това ще генерира заявка, подобна на тази:
db.person.findAll({'_class' ; 'com.igmtechnology.gravity.core.init.test.Manager'});
Има обаче малък проблем с този код. Ако промените пълното име на клас Manager
, тогава заявката няма да хвърли RuntimeException
, но няма да върне нищо. В този случай можете да използвате заместващ знак в @Query
.
@Query(value="{ '_class' : ?0 }")
List<Person> findAllManagers(String className);
След това, когато извикате метода, можете просто да направите:
managerRepository.findAllManagers(Manager.class.getName());
Предоставеният Manager.class.getName()
ще замени ?0
заместващ знак и вашата заявка ще бъде изградена правилно.
Същото важи и за Employee
хранилище с тази разлика, че трябва да предоставите напълно квалифицираното име на клас на Employee
в @Query
value
на атрибут.
Повече информация: