java - 带有 ObjectID 的 Spring Data Mongo 自定义存储库查询

标签 java spring mongodb spring-mvc spring-data-mongodb

我有一个要实现为 Spring Mongo 存储库的 mongo 查询

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(...) 定义的自动生成查询功能,而是选择手动构建用于查询 mongo 的 DBObject,并将功能定义为接口(interface)中的 default 实现,从而使其保持“干净” (" - 因为必须引入 _query 方法)

注意:此解决方案仅适用于 Java 1.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);
    }
}

关于java - 带有 ObjectID 的 Spring Data Mongo 自定义存储库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33805567/

相关文章:

Java - 更改使用 Graphics2D 创建的一些正方形的颜色

java - 单击提交后如何用数据填充两个实体

Heroku 上的 Django

node.js - 使用 Mongoose 在对象 ids 数组中查找对象 id 返回空数组

node.js - 无法从数组 $pull

java - 检查 JSTL 中的对象是否是新的

java - 错误地解析日期

Java基本GUI程序错误

java - JPA - 如果在 JPQL 查询获取子对象之前引用了父实体,则在忽略延迟加载的结果中获取父实体

java - Spring SimpleFormController - 浏览器后退按钮不起作用