【问题标题】:Issues when using OR in @Query Spring data mongo在 @Query Spring 数据 mongo 中使用 OR 时的问题
【发布时间】:2022-01-13 02:05:18
【问题描述】:

我的存储库中有以下方法:

@Query(value = "{ '$or' : [ ?0 ]}") List<MyObject> findByObject(String lookupKeyValuePairs);

我将以下字符串作为输入传递给此方法。

字符串:{ 'keyone': 'one','keytwo': 'one' },{ 'keyone': 'two','keytwo': 'two' }

我希望查询是 { '$or' : [ { 'keyone': 'one','keytwo': 'one' },{ 'keyone': 'two','keytwo': 'two' } ]},但 spring 正在评估上述查询

org.springframework.data.mongodb.core.MongoTemplate - find using query: { "$or" : ["{ 'keyone': 'one','keytwo': 'one' },{ 'keyone': 'two','keytwo': 'two' }"] } fields: Document{{}} for class: MyClass in collection: MyCollection

并抛出以下异常: Caused by: com.mongodb.MongoQueryException: Query failed with error code 2 and error message '$or/$and/$nor entries need to be full objects' on server

它是动态参数。键值对每次都会改变。这就是为什么我将整个内容作为字符串传递。

谁能帮忙指出问题出在哪里?

【问题讨论】:

    标签: java spring mongodb


    【解决方案1】:

    您可以将它们作为单独的参数传递吗?

    @Query("{ '$or' : [ { 'keyone': ?0,'keytwo': ?1},{ 'keyone': ?2,'keytwo': ?3 } ]}") 
    List<MyObject> findByObject(String param0, String param1, String param2, String param3);
    
    repo.findByObject('one', 'one', 'two', 'two');
    

    @Query("{ '$or' : [ { ?0: ?1, ?2: ?3},{ ?4: ?5, ?6: ?7 } ]}") 
    List<MyObject> findByObject(String param0, String param1, String param2, String param3, String param4, String param5, String param6, String param7);
    
    repo.findByObject('keyone', 'one', 'keytwo', 'one','keyone', 'two', 'keytwo', 'two');
    


    使用条件 api 传递动态查询参数的选项

    import java.util.List;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.mongodb.core.MongoOperations;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.util.Pair;
    import org.springframework.stereotype.Service;
    
    @Service
    public class MyObjectService {
    
        @Autowired
        private MongoOperations mongoOps;
    
        public List<MyObject> findByObject(List<Pair<String, String>> orParams) {
    
            Criteria[] orCriteria = orParams.stream()
                .map(param -> Criteria.where(param.getFirst()).is(param.getSecond()))
                .toArray(Criteria[]::new);
    
            final List<MyObject> results = mongoOps.find(Query.where(new Criteria().orOperator(orCriteria)), MyObject.class);
            return results;
    
        }
    }
    

    List<MyObject> results = service.findByObject(List.of(
        Pair.of("keyone", "one"), 
        Pair.of("keytwo", "one"), 
        Pair.of("keyone", "two"), 
        Pair.of("keytwo", "two")
    ));
    

    【讨论】:

    • 动态参数。键值对每次都会改变。这就是为什么我将整个事情作为字符串传递。
    • 如何使用标准api,添加在上面
    猜你喜欢
    • 2023-04-03
    • 2021-07-20
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2019-05-24
    相关资源
    最近更新 更多