我使用一种方法具有简单的界面:
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
}
[通常,我的目的是实现剩余查询语言,对于gt
,lt
之类的每个操作,我都有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));
}
可能您对如何更好地实现它有任何建议
使用此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;
}