Фильтровать значения вложенной карты в данных Spring mongo query-dsl - PullRequest
0 голосов
/ 26 декабря 2018

Я интегрирую Spring-Data-mongo с query-dsl, поэтому мне нужно сгенерировать Q-файлы для query-dsl запросов. Вот мой заказ POJO:

public class Order {
    private List<Map<String,Object>> items;
}

Мой Q файл заказа.java

public class QOrder extends EntityPathBase<Order> {

    private static final long serialVersionUID = -682690651L;

    public static final QOrder order = new QOrder("order");

    public final ListPath<java.util.Map<String, Object>, SimplePath<java.util.Map<String, Object>>> items = this.<java.util.Map<String, Object>, SimplePath<java.util.Map<String, Object>>>createList("items", java.util.Map.class, SimplePath.class, PathInits.DIRECT2);

    public QOrder(String variable) {
        super(Order.class, forVariable(variable));
    }

    public QOrder(Path<? extends Order> path) {
        super(path.getType(), path.getMetadata());
    }

    public QOrder(PathMetadata metadata) {
        super(Order.class, metadata);
    }
}

и пример заказа json:

{
    "items": [{
        "itemName": "phone",
        "quantity": <Integer-Number>
    }
    ]
}

Теперь я хочу получить все ордера из Монго, для которых любой элемент существует с количеством 1. Теперь я генерирую свойПредикат, как показано ниже."QSensorData.sensorData.data.any (). Eq ( Some-QueryDSL-Expression )".

Я не могу определить, что нужно передать в метод eq для фильтрации вложенных значений карты.

1 Ответ

0 голосов
/ 03 января 2019

Измените класс заказа, чтобы включить атрибут списка, где элемент содержит поля itemName и количество.Что-то вроде

public class Order {
    private List<Item> items;
}

public class Item {
    private String itemName;
    private Integer quantity;
}

Создание классов Q.

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

BooleanExpression expression = QOrder.order.items.any().quantity.eq(1);
List<Order> results = repository.findAll(expression);

Как отмеченов комментарии для возврата всех отфильтрованных элементов со значением 1 необходимо использовать запрос агрегации.

что-то вроде

Статический импорт

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq.valueOf;

Запрос агрегации

Aggregation aggregation = newAggregation(
           project().and(filter("items")
             .as("item")
             .by(valueOf(
                  "item.quantity")
                   .equalToValue(
                  1)))
          .as("items");
);

List<Order> results = mongoTemplate.aggregate(aggregation, Order.class, Order.class)
...