【发布时间】:2016-06-30 09:40:36
【问题描述】:
我在 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 映射中查询 K-V 对。我收到一个错误:No mapping metadata found for java.lang.Object
为什么会这样?此外,我在 Couchbase 中将 json 对象存储为 Map<String,Object>,我尝试使用 jackson JsonNode 类型,但该对象还存储了与类相关的元数据。有更好的数据类型来表示json类型吗?
编辑
存储在 Couchbase 中的数据:
{
"_object" : {
"Name" : "Kapil",
"Age" : {
"Nested" : 21
}
},
"_subject" : "Subject",
"_predicate" : "Predicate"
}
我要查找的键是 _object.Name,值是 'Kapil'
【问题讨论】:
-
您存储在地图中的数据类型是什么?您的查询中
key和value的类型和值是什么? -
在旁注中,有一个长的 id 是可行的,但最好有一个更精心制作的字符串 id(例如,带有“gsonStore”前缀和一个数字)。默认情况下,所有文档都存储在 Couchbase 中的同一个存储桶中,因此数字 id 大大增加了冲突和覆盖的机会,如果您不格外小心,请始终为所有类型的实体的所有 id 使用相同的源...
-
我已编辑问题以显示我存储在地图中的数据。感谢您对长 ID 的提醒,我们会做出改变!
-
另一个问题是您所做的查询不包括 WHERE 子句中
_class字段的过滤器:应该是WHERE "+path+"="+"'"+value+"' AND _class = '" + GsJsonStore.class.getName() + "'" -
_object中的数据真的总是在变化,或者您是否能够创建一个类(例如SubObject),它对所有可能的数据字段都具有(可为空的)属性?您也可以尝试向GsJsonStore添加一个空的私有构造函数吗?
标签: couchbase spring-data-couchbase