我在编写允许以直接方式获取用户和声明详细信息的代码时遇到问题。这是我的 MongoDB 结构,
db.user.find();
user:
{
"name" : "KSK",
"claim" : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")]
}
claim:
[
{
"_id" : "52ffc4a5d85242602e000001",
"claimName" :"XXXX"
},
{
"_id" : "52ffc4a5d85242602e000000",
"claimName" :"YYY"
}
]
我的实体类是:
@Document(collection="user")
public class User{
@Id
private String id;
private String name;
@DBRef
private List<Claim> claim;
// setter and getter
}
声明类:
@Document(collection="Claim")
public class Claim{
@Id
private String id;
private String claimName;
}
我有一种方法可以按如下名称获取用户,
public User findByName(String name);
如果我尝试使用此方法会收到一个错误,
找不到能够从 org.bson.types.ObjectId
类型转换的转换器输入 java.lang.String
所以我改变了我的用户实体类,如下所示,
而不是 private List<Claim> claim
;
改为Private List<ObjectId> claim
;
现在,如果我执行一个方法(findByName),我会得到一个拥有两个声明对象 ID ("52ffc4a5d85242602e000001","52ffc4a5d85242602e000000")
的用户对象,然后迭代Claim列表,得到Claim对象Id对应的Claim详情。
当我执行 findByName
时,而不是这样做方法我想获取用户并声明详细信息。我怎样才能实现这个功能?
最佳答案
如果您在 User
类中使用 @DBRef 引用您的 Claim
,那么您的 JSON 不仅应该包含 ID,还应该包含对在哪里可以找到 ID 的集合的引用同样,像这样:
{
"name" : "KSK",
"claim" : [
{
"$ref" : "claim", // the target collection
"$id" : ObjectId("52ffc4a5d85242602e000000")
}
]
}
这就是 Spring-Data 将 Java 对象映射到 MongoDB 的方式。如果你从一个空白数据库开始,让 Spring 创建并保存关系,你应该没有问题使用
@DBRef List<Claim> claims;
关于java - Spring Mongo DB @DBREF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44259583/