是否有可能使用Spring Data MongoDb定义自定义条件?

问题描述 投票:0回答:1

我使用一种方法具有简单的界面:

 Criteria toCriteria(String key, String value)

接下来我要下一个实现

public class EqExpression implements Expression
{

     @Override
     public Criteria toCriteria(String key, String value)
     {
        return Criteria.where(key).eq(Pattern.compile(value));
     }
}

}

但没有$ eq运算符。所以我的问题:

  • 为什么org.springframework.data.mongodb.core.query.Criteria没有这样的运算符?
  • 是否有实现自定义条件实现的方法,或者有任何解决方法?

  • 对我来说,最好有类似的代码

     @Override
     public Criteria toCriteria(String key, String value)
     {
        //return new BasicDBObject(key, new BasicDBObject("$eq", value)) converted to Criteria
     }
    

[通常,我的目的是实现剩余查询语言,对于gtlt之类的每个操作,我都有Expression接口的特定实现。

请求可能看起来像name=John&age>20

我正在使用下一个代码构建整个查询:

List<Criteria> criterias = new ArrayList<Criteria>();
...
while (matcher.find())
    {
        String key = matcher.group(1);
        String operator = matcher.group(2);
        String value = matcher.group(3);
        // get from map appropriate implementation
        criterias.add(expressions.get(operator).toCriteria(key, value));
    }

可能您对如何更好地实现它有任何建议

java spring-data-mongodb
1个回答
0
投票

使用此answer,我能够创建简单的$ eq条件

private Criteria getEqCriteria(String value)
{
    // hack Criteria, because new Criteria().is(value) not working!
    Criteria c = new Criteria();
    try
    {
        Field _criteria = c.getClass().getDeclaredField("criteria");
        _criteria.setAccessible(true);
        @SuppressWarnings("unchecked")
        LinkedHashMap<String, Object> criteria = (LinkedHashMap<String, Object>) _criteria.get(c);
        criteria.put("$eq", value);
        Field _criteriaChain = c.getClass().getDeclaredField("criteriaChain");
        _criteriaChain.setAccessible(true);

        @SuppressWarnings("unchecked")
        List<Criteria> criteriaChain = (List<Criteria>) _criteriaChain.get(c);
        criteriaChain.add(c);
    } catch (Exception e)
    {
        // Ignore
    }
    return c;
}
© www.soinside.com 2019 - 2024. All rights reserved.