web-dev-qa-db-ja.com

リポジトリインターフェイスを使用して、Spring DataでネストされたオブジェクトのobjectIdによってコレクションを見つける方法は?

次のようなアイテムを含むコレクションがMongoDBにあります。

_{
    "_id" : ObjectId("53e4d31d1f6b66e5163962e3c"),
    "name" : "bob",
    "nestedObject" : {
        "_id" : ObjectId("53f5a623cb5e4c1ed4f6ce67")
        //more fields...
    }
}
_

このアイテムのJava表現は次のようになります。

_public class SomeObject {
    @Id
    private String id;
    private String name;
    private NestedObject nestedObject;

    //getters and setters
}
_

リポジトリインターフェイスは次のように定義されます。

_public interface SomeObjectRepository extends MongoRepository<SomeObject, String> {
    public List<SomeObject> findByName(String name);
    public List<SomeObject> findByNestedObjectId(String id);
    //some other find functions
}
_

現在、findByName(String name)は正常に機能していますが、findByNestedObjectId(String id)は何も返しません。

質問は:リポジトリインターフェイスを使用して、ネストされたオブジェクトの属性によってコレクションアイテムを見つけることは可能ですか?そうでない場合、この問題に取り組むための推奨される方法は何ですか?リポジトリ全体を再実装せずに可能ですか?

13
greg

Spring-data-mongodb_ idフィールドをObjectIdに変換しませんクエリ操作時にネストされたクラスに自動的に入力します。手動で変換する必要があります。例えば:

public List<SomeObject> findByNestedObjectId(String id) {
    Query query = Query.query(new Criteria("nestedObject._id", convertToObjectId(id)));
    return mongoTemplate.find(query, SomeObject.class);
}

Object convertToObjectId(Object id) {
    if (id instanceof String && ObjectId.isValid(id)) {
        return new ObjectId(id);
    }
    return id;
}
2
Wizard

私はこれを解決する方法を考え出しました。

パラメータタイプをorg.bson.types.ObjectIdに変更します。文字列から

public List<SomeObject> findByNestedObjectId(ObjectId id);

そしてあなたがそれを使うとき

 repositoryName.findByNestedObjectId(new ObjectId(theIdString));
26
Ramon Rahman

NestedObjectが次のようになっている場合:

class NestedObject {

  @Id String id;
}

クエリに渡すString値は、有効なObjectIdクエリです。

findByNestdObjectId(String id);

動作するはずです。チケットを自由に作成できない場合は [〜#〜] jira [〜#〜] そしてそれを再現するための小さなテストケースを提供してください。

2
Oliver Drotbohm

ネストされたオブジェクトIDはに変換する必要があります

 org.bson.types.ObjectId 

次に、ObjectIdをリポジトリメソッドで使用できます

findAllByNestedObject_Id(ObjectId)
0
Rajesh Khore

私はSpring-bootに以下を使用しています。私にとって魅力のように機能します:

@Query("nestedObjectProperty.$id : ?0")
0
Youssef Gamil

これは1.6.2spring-data-mongodbで機能しました。しかし、最新バージョンに問題があります。

public interface SomeObjectRepository extends MongoRepository<SomeObject, String> {
    public List<SomeObject> findByName(String name);
    @Query("nestedObjectProperty._id : { $oid : ?0}")
    public List<SomeObject> findByNestedObjectId(String id);
    //some other find functions
}

リポジトリで使用されるmongoDBクエリは@Queryで指定できます。私は100%ではありません。以下のクエリは正確ですが、これに沿ったものです。

public interface SomeObjectRepository extends MongoRepository<SomeObject, String> {
    public List<SomeObject> findByName(String name);
    @Query("{nestedObject._id : ?0}")
    public List<SomeObject> findByNestedObjectId(String id);
    //some other find functions
}
0
kallehj