gre*_*reg 13 java spring mongodb spring-data-mongodb
我在MongoDB中有一个包含这样的项目的集合:
{
"_id" : ObjectId("53e4d31d1f6b66e5163962e3c"),
"name" : "bob",
"nestedObject" : {
"_id" : ObjectId("53f5a623cb5e4c1ed4f6ce67")
//more fields...
}
}
Run Code Online (Sandbox Code Playgroud)
此项的Java表示如下所示:
public class SomeObject {
@Id
private String id;
private String name;
private NestedObject nestedObject;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
Repository接口定义如下:
public interface SomeObjectRepository extends MongoRepository<SomeObject, String> {
public List<SomeObject> findByName(String name);
public List<SomeObject> findByNestedObjectId(String id);
//some other find functions
}
Run Code Online (Sandbox Code Playgroud)
现在,findByName(String name)它应该正常工作,但findByNestedObjectId(String id)什么都不返回.
问题是:是否可以使用存储库接口通过嵌套对象的属性查找集合项?如果没有,建议的方法是什么?没有重新实现整个存储库是否可能?
小智 25
我已经想出如何解决这个问题.
将参数类型更改为org.bson.types.ObjectId; 来自String
public List<SomeObject> findByNestedObjectId(ObjectId id);
Run Code Online (Sandbox Code Playgroud)
当你打电话给它使用
repositoryName.findByNestedObjectId(new ObjectId(theIdString));
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16494 次 |
| 最近记录: |