春季蒙戈DB@DBREF

2022-09-02 22:05:36

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

所以我更改了我的用户实体类,如下所示,

而不是private List<Claim> claim;

更改为Private List<ObjectId> claim;

现在,如果我执行一个方法(findByName),我会得到一个同时具有声明对象ID的用户对象,然后迭代声明列表并获取与声明对象Id对应的声明详细信息。("52ffc4a5d85242602e000001","52ffc4a5d85242602e000000")

当我执行方法时,我希望获取用户和声明详细信息,而不是这样做。如何实现此功能?findByName


答案 1

如果您在具有@DBRef的类中引用您的 s,则 JSON 不仅应包含 ID,还应包含对在何处查找 ID 的集合的引用,如下所示:ClaimUser

{
  "name" : "KSK", 
  "claim" : [ 
     { 
       "$ref" : "claim", // the target collection
       "$id" : ObjectId("52ffc4a5d85242602e000000")
     }
  ] 
}

这就是Spring-Data如何将Java对象映射到MongoDB。如果您从空白数据库开始,并让Spring创建并保存关系,则使用

 @DBRef List<Claim> claims;

答案 2

我的建议是不要将该 Claim 类设置为单独的@Document或者只是切换回关系数据库,因为它不是 Mongo 方法。另外,如果你坚持当前的架构,你可以尝试使用用户列表中@DBRef上方.class到smth中,如下所示:

public class ParentModel {

    @Id
    private String id;

    private String name;

    private ParentType parentType;

    private SubType subType;

    @DBRef
    private List<Model> models;

....
}