簡體   English   中英

如何在Java中使用QueryDSL,Spring-Data,MongoDB創建嵌入式謂詞

[英]How to create embedded predicate using QueryDSL, Spring-Data, MongoDB in Java

我的存儲庫實現以下接口:

QueryDslPredicateExecutor<Rule>

mongo的document(Rule對象)的結構為:

{
        "_id" : ObjectId("5aa924242a73bec4ce581717"),
        "name" : "test-name",
        "expressionGroups" : [
                {
                        "type" : "WHEN",
                        "expressions" : [
                                {
                                        "name" : "name1",
                                        "values" : ["VAL1", "VAL2", "VAL3"]
                                },
                                {
                                        "name" : "name2",
                                        "values" : ["VAL4", "VAL5"]
                                }
                        ]
                },
                {
                        "type" : "FOR",
                        "expressions" : [
                                {
                                        "name" : "name3",
                                        "values" : ["VAL6", "VAL7"]
                                }
                        ]
                }
        ]
}

我想使用以下方法在mongodb中查找特定規則:

Iterable<T> findAll(Predicate predicate);

我已經准備好mongo shell查詢:

db.rule.find({
  'expressionGroups.expressions': {
    $all: [
      {
        '$elemMatch': {
          'name': "name1",
          'values': "VAL2"
        }
      },
      {
        '$elemMatch': {
          'name': "name3",
          'values': "VAL7"
        }
      }
    ]
  }
}).pretty()

如何根據上述查詢創建com.querydsl.core.types.Predicate?

仍然沒有答案,我遇到了同樣的問題。 所以我創建了這樣的代碼:

private List<Predicate> toPredicates(String root, Map<String, Object> map) {
    List<Predicate> predicates = new ArrayList<>();

    for (Map.Entry<String, Object> entry: map.entrySet()) {
        String path = root+'.'+entry.getKey();
        Object value = entry.getValue();

        if (entry.getValue() instanceof Map) {
            predicates.addAll(toPredicates(path, (Map<String, Object>) value));
        } else {
            predicates.add(new SimplePath(path).eq(value.toString()));
        }
    }

    return predicates;
}

private static class SimplePath extends StringPath {
    protected SimplePath(String var) {
        super(var);
    }
}

因此,您可以將Json解析為Map就是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM