どちらのリポジトリでも、@Query
を使用できます メソッド名から派生したクエリの代わりに使用されるMongoDBJSONクエリ文字列を指定するアノテーション(リポジトリのメソッド名を解析し、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
属性。
詳細: