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

2022-09-03 17:30:53

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

问题是:是否可以使用存储库接口通过其嵌套对象的属性来查找集合项?如果没有,那么解决此问题的推荐方法是什么?在不重新实现整个存储库的情况下是否可能?


答案 1

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

将参数类型更改为 org.bson.types.ObjectId;从字符串

public List<SomeObject> findByNestedObjectId(ObjectId id);

当您调用它时使用

 repositoryName.findByNestedObjectId(new ObjectId(theIdString));

答案 2

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