Java 使用ObjectID的Spring Data Mongo自定义存储库查询
我有一个mongo查询,我想作为Spring mongo存储库实现Java 使用ObjectID的Spring Data Mongo自定义存储库查询,java,spring,mongodb,spring-mvc,spring-data-mongodb,Java,Spring,Mongodb,Spring Mvc,Spring Data Mongodb,我有一个mongo查询,我想作为Spring mongo存储库实现 db.collection.find({ 'items': { $elemMatch: { 'refund.$id' : ObjectId('5638cab2e4b07ff212618d7e') } } }) 我的存储库界面是 @Query("{ 'items': { $elemMatch: { 'refund.$id' : ObjectId(?0) } } }")
db.collection.find({ 'items':
{ $elemMatch: {
'refund.$id' : ObjectId('5638cab2e4b07ff212618d7e')
}
}
})
我的存储库界面是
@Query("{ 'items': { $elemMatch: { 'refund.$id' : ObjectId(?0) } } }")
RMA findRMAByItemRefund(String refundId);
它抛出JSONParseException
Caused by: com.mongodb.util.JSONParseException:
{ 'items': { $elemMatch: { 'refund.$id' : ObjectId("_param_0") } } }
^
at com.mongodb.util.JSONParser.parse(JSON.java:216)
试试这个
@Query("{ 'items': { $elemMatch: { 'refund.id' : ?0 } } }")
RMA findRMAByItemRefund(String refundId);
根据我的经验,?0
应该是独立的,而不是用作mongo函数参数
另外,
$id
是您自己的假设,还是该字段实际存储为$id
。如果没有,我将使用return.id
,因为接受的解决方案在我的情况下没有产生任何结果,我必须找到另一个解决方案,即:
我没有使用通过@query(…)
定义的自动生成查询功能,而是选择手动构建用于查询mongo的DBObject
,并将该功能定义为界面中的默认实现,从而保持其“干净”
(“
-因为必须引入一个\u查询
方法)
注意:此解决方案仅适用于Java1.8+
public interface SomeRepository extends MongoRepository<SomeEntity, String> {
@Query("{'nestedEntity._id': ?0}")
SomeEntity findByNestedEntityId_DoesntWork(String nestedEntityId);
@Query("?0")
SomeEntity _query(DBObject query);
default SomeEntity findByNestedEntityId(String nestedEntityId) {
DBObject queryObject = BasicDBObjectBuilder
.start("nestedEntity._id", new ObjectId(nestedEntityId))
.get();
return this._query(queryObject);
}
}
公共接口SomeRepository扩展了MongoRepository{
@查询(“{'nestedEntity.\u id':?0}”)
SomeEntity FindBynedEntityId_不工作(字符串nestedEntityId);
@查询(“?0”)
SomeEntity\u查询(DBObject查询);
默认SomeEntity FindBynedEntityId(字符串nestedEntityId){
DBObject queryObject=BasicDBObjectBuilder
.start(“nestedEntity.\u id”,新对象id(nestedEntityId))
.get();
返回此。_查询(queryObject);
}
}
我想我的问题有点不同,但因为我在任何地方都找不到答案,所以我认为值得一提。
基本上,我想通过ObjectId和userId进行搜索,所以我做了以下工作:
@Query(“{u-id':?0,'userId':?1}”)
T findbyobjectanduserid(最终ObjectId ObjectId,最终Long userId);
这是mongo
文档中的示例对象:
{
"_id" : ObjectId("5c052a43f14008522c1c90c8"),
"_class" : "com.gdn.payment.report.entity.ReportDocument",
"status" : "DONE",
"report" : {
"id" : ObjectId("5c0508bcf14008460015eb07"),
"startDate" : NumberLong(1542795843188),
"endDate" : NumberLong(1543568857157),
"fields" : [
"customerInfo.billingAddress.streetAddress",
"customerInfo.name",
"items[*].name",
"orderId",
"type"
]
}
}
您可以仅使用ObjectId
数据类型创建用于搜索report.id
的存储库方法,我尝试仅使用字符串,但无法使用,以下是我的存储库方法:
Page<ReportDocument> findByReport_id(ObjectId reportId, Pageable pageable)
我建议使用Spring数据。您也可以在顶部使用
然后,您就可以编写更复杂的查询,而不必处理诸如查询语法和解析之类的次要问题。您是否试图将参数
returnID
绑定到查询参数return.$id
?如果return
是另一个实体,那么您可以尝试return.id
,因为Spring没有这个id自行转换是的。它很有效@JoaoEvangelista Spring处理转换。非常感谢您如果接受的解决方案中的$elemMatch不适合您,请尝试此解决方案。它工作得非常好!
new ObjectId({input-reportId-string})