Ceci est ma structure MongoDb,
db.user.find();
utilisateur:
{
"name" : "KSK",
"claim" : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")]
}
prétendre:
[
{
"_id" : "52ffc4a5d85242602e000001",
"claimName" :"XXXX"
},
{
"_id" : "52ffc4a5d85242602e000000",
"claimName" :"YYY"
}
]
Ma classe d'entité est:
@Document(collection="user")
public class User{
@Id
private String id;
private String name;
@DBRef
private List<Claim> claim;
// setter and getter
}
Classe de réclamation:
@Document(collection="Claim")
public class Claim{
@Id
private String id;
private String claimName;
}
J'ai une méthode pour obtenir les utilisateurs par nom comme ci-dessous,
public User findByName(String name);
Si j'essaie de frapper cette méthode, j'obtiens une erreur qui,
Aucun convertisseur trouvé capable de convertir du type org.bson.types.ObjectId en type Java.lang.String
J'ai donc changé ma classe d'entité utilisateur comme ci-dessous,
Au lieu de private List<Claim> claim
;
Modifié en Private List<ObjectId> claim
;
Maintenant, si j'exécute une méthode (findByName), j'obtiens un objet utilisateur qui a les deux identifiants d'objet de revendication ("52ffc4a5d85242602e000001", "52ffc4a5d85242602e000000"), puis itérez la liste des revendications et obtenez les détails de la revendication correspondant à l'ID d'objet de revendication.
Au lieu de faire cela, lorsque j'exécute la méthode findByName, je veux obtenir un utilisateur et revendiquer les détails. Comment puis-je obtenir cette fonctionnalité
Si vous référencez vos Claim
dans la classe User
avec @DBRef, votre JSON ne doit pas seulement contenir l'ID mais la référence à la collection où trouver l'ID également, comme ceci:
{
"name" : "KSK",
"claim" : [
{ "$ref":"claim", // the target collection
"$id : "ObjectId("52ffc4a5d85242602e000000")
}
]
}
Voilà comment Spring-Data mappe vos objets Java à MongoDB. Si vous commencez avec une base de données vierge et laissez Spring créer et enregistrer les relations, vous ne devriez avoir aucun problème à utiliser
@DBRef List<Claim> claims;
Ma suggestion n'est pas de définir cette classe de réclamation dans un @Document distinct ou de revenir simplement aux bases de données relationnelles, car ce n'est pas une approche Mongo. De plus, si vous insistez sur l'architecture actuelle, vous pouvez essayer d'utiliser @DBRef au-dessus de cette liste dans User.class dans smth comme ceci:
public class ParentModel {
@Id
private String id;
private String name;
private ParentType parentType;
private SubType subType;
@DBRef
private List<Model> models;
....
}