如何使用存储库接口在Spring Data中通过其嵌套对象的objectId查找集合?

时间:2014-08-22 07:14:16

标签: java spring mongodb spring-data-mongodb

我在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
}

Repository接口的定义如下:

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)没有返回任何内容。

问题:是否可以使用存储库界面通过它的嵌套对象属性查找集合项?如果没有,建议的方法是什么?没有重新实现整个存储库是否可能?

7 个答案:

答案 0 :(得分:24)

我已经想出如何解决这个问题。

将参数类型更改为org.bson.types.ObjectId;来自String

public List<SomeObject> findByNestedObjectId(ObjectId id);

当你打电话给它时使用

 repositoryName.findByNestedObjectId(new ObjectId(theIdString));

答案 1 :(得分:2)

如果NestedObject看起来像这样:

class NestedObject {

  @Id String id;
}

您在查询中的String值是有效的ObjectId查询:

findByNestdObjectId(String id);

应该有效。如果它不能在JIRA内创建一张票,并提供一个小的测试用例来重现它。

答案 2 :(得分:0)

您可以使用@Query指定存储库使用的mongoDB查询。我不是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
}

答案 3 :(得分:0)

在查询操作中,

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;
}

答案 4 :(得分:0)

这对我来说是1.6.2 spring-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
}

答案 5 :(得分:0)

我正在使用以下内容进行Spring-boot;对我来说就像魅力一样:

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

答案 6 :(得分:0)

nestedObject id需要转换为

 org.bson.types.ObjectId 

然后ObjectId可以与存储库方法一起使用

findAllByNestedObject_Id(ObjectId)