0

CouchBase リポジトリにエンティティを保持し、クエリを実行しようとしています。エンティティは次のようになります。

@Document(expiry = 0)
public class GsJsonStore implements Serializable {
    private static final long serialVersionUID = 7133072282172062535L;
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;
    @Field
    private Map<String,Object> _object;
    @Field
    private String _subject;
    @Field
    private String _predicate;
    //Getters and Setters 
    }

次のように、CouchbaseOperations テンプレートで N1QL クエリを使用してエンティティをクエリしています。

String query1 =  "SELECT META(default).id as _ID, META(default).cas as _CAS, default.* FROM default WHERE "+key+"="+"'"+value+"'";

List<GsJsonStore> list = operations.findByN1QL(N1qlQuery.simple(query1), GsJsonStore.class);

_object マップ内で KV ペアを照会しています。エラーが発生します:No mapping metadata found for java.lang.Object

なぜこうなった?Map<String,Object>また、 Couchbase のようにjson オブジェクトを格納しています。jacksonJsonNode型を使用してみましたが、オブジェクトにはクラス関連のメタデータも格納されていました。json 型を表すより良いデータ型はありますか?

編集

Couchbase に保存されたデータ:

{
"_object" : {
"Name" : "Kapil",
"Age" : {
"Nested" : 21
}
},
"_subject" : "Subject",
"_predicate" : "Predicate"
}

私が探しているキーは _object.Name で、値は「Kapil」です

4

2 に答える 2

5

ここで説明したように、デフォルトの SPMappingCouchbaseConverter をオーバーライドする必要があります。

これが私が問題を解決した方法です:

@Bean
public MappingCouchbaseConverter mappingCouchbaseConverter() throws Exception {
    return new MyMappingCouchbaseConverter(couchbaseMappingContext());
}

private class MyMappingCouchbaseConverter extends MappingCouchbaseConverter {

    MyMappingCouchbaseConverter(MappingContext<? extends CouchbasePersistentEntity<?>, CouchbasePersistentProperty> mappingContext) {
        super(mappingContext);
    }

    @Override
    @SuppressWarnings("unchecked")
    protected <R> R read(final TypeInformation<R> type, final CouchbaseDocument source, final Object parent) {
        if (Object.class == typeMapper.readType(source, type).getType()) {
            return (R) source.export();
        } else {
            return super.read(type, source, parent);
        }
    }

}
于 2016-04-26T14:26:46.293 に答える