找不到java.lang.Object的映射元数据 - Couchbase

Kap*_*nky 0 couchbase spring-data-couchbase

我在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 
    }
Run Code Online (Sandbox Code Playgroud)

我在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);
Run Code Online (Sandbox Code Playgroud)

我在_object Map中查询KV对.我收到一个错误:No mapping metadata found for java.lang.Object

为什么会这样?另外,我Map<String,Object>在Couchbase中存储json对象,我尝试使用jackson JsonNode类型,但对象也存储了类相关的元数据.是否有更好的数据类型来表示json类型?

编辑

存储在Couchbase中的数据:

{
"_object" : {
"Name" : "Kapil",
"Age" : {
"Nested" : 21
}
},
"_subject" : "Subject",
"_predicate" : "Predicate"
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的关键是_object.Name,值是'Kapil'

ras*_*tao 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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 如果地图内有这样的有效负载,这种方法将会失败。"myCustomMap":{"array":[{}]} (2认同)