spring-data-mongodb を使用して Java でアプリの開発を開始したところ、解決できない問題に遭遇しました。
次のようなドキュメント Bean をいくつか用意します。
@Document(collection="myBeanBar")
public class BarImpl implements Bar {
String id;
Foo foo;
// More fields and methods ...
}
@Docuemnt
public class FooImpl implements Foo {
String id;
String someField;
// some more fields and methods ...
}
そして、次のような検索を呼び出すだけのメソッドを持つリポジトリ クラスがあります。
public List<? extends Bar> findByFooField(final String fieldValue) {
Query query = Query.query(Criteria.where("foo.someField").is(fieldValue));
return getMongoOperations().find(query, BarImpl.class);
}
Bar の保存は問題なく機能します。Foo と Bar の両方の「_class」属性とともに mongo に保存されます。ただし、Foo の属性で検索すると、次のような例外がスローされます。
Exception in thread "main" java.lang.IllegalArgumentException: No property someField found on test.Foo!
at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225)
at org.springframework.data.mongodb.core.convert.QueryMapper.getPath(QueryMapper.java:202)
at org.springframework.data.mongodb.core.convert.QueryMapper.getTargetProperty(QueryMapper.java:190)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:86)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486)
クエリのどこにもサブドキュメントの具象型が指定されておらず、Bar のエンティティ情報は foo の型が Foo (FooImpl ではない) であり、プロパティを持つことができないため、掘り下げた後、これはある程度理にかなっています。インターフェースだからです。
私の質問は次のとおりです。サブドキュメント タイプを具象タイプとして宣言せずに、この問題を指定または回避する方法はありますか?
数日間グーグルでドキュメントとAPIとソースコードを見てきましたが、それを行う明確な方法が見つかりません. よろしくお願いします。
どうもありがとうございました。