2017-05-30 9 views
3

これは私のMongoDB構造で、春モンゴDB @DBREF

db.user.find(); 

ユーザー:

{ 
"name" : "KSK", 
"claim" : [objectId("52ffc4a5d85242602e000000"),objectId("52ffc4a5d85242602e000001")] 
} 

主張:

[ 
    { 
    "_id" : "52ffc4a5d85242602e000001", 
    "claimName" :"XXXX" 
    }, 
    { 
    "_id" : "52ffc4a5d85242602e000000", 
    "claimName" :"YYY" 
    } 
] 

マイEntityクラスは次のとおりです。

@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に変換できることが判明しました

私はUser Entityクラスを以下のように変更しました

private List<Claim> claimの代わりに;

Private List<ObjectId> claimに変更。

メソッド(findByName)を実行すると、クレームオブジェクトID(「52ffc4a5d85242602e000001」、「52ffc4a5d85242602e000000」)を持つユーザーオブジェクトが取得され、クレームリストを反復し、クレームオブジェクトID 。

findByNameメソッドを実行すると、これを実行する代わりに、ユーザーとクレームの詳細を取得する必要があります。この機能を実現するにはどうすればいいですか?

+0

あなたの最初のアプローチを使用して問題はないはずです。キャメラケースの問題ではないと確信できますか?Javaクラスの '' claimname''とJSONの '' ClaimName''を参照してください。 – Matt

+0

@Mattそれは単にタイプミスです。私は今修正した。 – KSK

答えて

1

あなたは@DBRefとUserクラス、あなたのJSONであなたのClaim Sを参照する場合春データは、あなたのJavaのMongoDBにオブジェクトをマッピングする方法である

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

:これだけのようにもIDを見つけるためのIDが、コレクションへの参照を含めるべきではありません。あなたは空のデータベースで開始し、春には作成してみましょうとの関係を保存する場合は、 は大丈夫に見え一覧で

@DBRef List<Claim> claims; 
+0

こんにちは。答えてくれてありがとう。それはうまく動作します。 – KSK

1

私は、その要求クラスを別の@Documentに設定したり、リレーショナルデータベースに戻したりするのではなく、Mongoアプローチではないからです。あなたが現在のアーキテクチャを主張する場合 また、あなたは次のようになめらかにUser.classにそのリストの上@DBRef使用して試すことができます:

public class ParentModel { 

    @Id 
    private String id; 

    private String name; 

    private ParentType parentType; 

    private SubType subType; 

    @DBRef 
    private List<Model> models; 

.... 
} 
+0

私は私のポストにDBRefを追加することにしました。今私はそれを編集しました。今見てください。埋め込みリレーションシップを使用する場合、組み込みドキュメントのサイズが大きくなりすぎると、読み書きのパフォーマンスに影響を与える可能性があります。だから、私は参照関係で行くことにした。 – KSK

+0

あなたは16 MBを超えるでしょうか?それは巨大な文書でなければなりません。あなたがリストを持つユーザを得ることができたら私はあなたがこれより上にしたいものを本当に理解していないのですか?あなたがそれをもっとはっきりと説明すれば、私は助けようとします –

+0

私はDBRefプライベートリストを追加すれば私はエラーが発生しています。私は私のポストのエラーを述べました。私が必要とするのは、findByNameを呼び出すと、ユーザーとクレームの詳細に対応することです。 – KSK

関連する問題