java - Spring Mongo DB @DBREF

标签 java mongodb spring-mongo spring-mongodb

我在编写允许以直接方式获取用户和声明详细信息的代码时遇到问题。这是我的 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/

相关文章:

java - 使用第 3 方库的微调器时出现 setOnItemSelectedListener 错误

java - 响应返回给客户端后清理

java - 以编程方式添加没有可见边距的按钮

javascript - JS Express 连接到 mongoose 数据库

java - 如何对 mongodb ObjectId 字段进行正则表达式查询

mongodb - meteor ,Mongo 查询查找每第 n 个文档

spring-boot - 如何使用自定义过滤器在 Spring Data mongodb 中使用分页和排序?

Java:Runtime.exec 获取 Linux 发行版名称

spring-data - 带有排除选项的spring data mongodb @Query

java - 执行 MongoTemplate.aggregate 而不进行行检索