Spring data Mon go db. Преобразовать из документа в критерии - PullRequest
0 голосов
/ 28 февраля 2020

Итак, из Criteria у нас есть getCriteriaObject, который возвращает Document, и затем вы можете выполнить некоторые операции с документом, но затем я хочу использовать результаты, преобразовав обратно в Criteria, я не мог действительно не могу найти как.

Конечно, давайте рассмотрим комплекс Criteria с несколькими операторами и т. Д. c. Есть идеи?

1 Ответ

0 голосов
/ 29 февраля 2020

Краткий ответ: Нет

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"));
...