Краткий ответ: Нет
Criteria
имеет Querydsl -Как синтаксис, который позволяет генерировать типобезопасных запросов. Чтение из Document
может привести к несовместимым с MongoDB командам или синтаксису для текущей версии MongoDB.
Длинный ответ: Да
Мы можем реализовать обход с Java отражением для добавления Документа key:value
в поля Критерии private
. Предупреждение: Вы предполагаете, что у вашего Document
есть совместимые операторы с правильным синтаксисом.
Добавьте этот вспомогательный метод в ваш класс ( souce ):
public static Criteria from(Document document) {
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);
for (Entry<String, Object> set : document.entrySet()) {
criteria.put(set.getKey(), set.getValue());
}
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;
}
Теперь создайте новый экземпляр для Criteria
из Document
:
Criteria newCriteria = from(criteria.getCriteriaObject());
//You have full-compatible Criteria instance
newCriteria.and("foobar").elemMatch(Criteria.where("field").is("value"));