【问题标题】:Spring data Mongo db Convert from Document to CriteriaSpring data Mongo db 从文档转换为标准
【发布时间】:2020-02-28 15:41:43
【问题描述】:

所以从Criteria 我们有getCriteriaObject 它返回Document 然后你可以对文档进行一些操作,但是我想通过转换回Criteria 来使用结果,我不能真的不知道怎么做。

当然,让我们考虑复杂的Criteria 与多个运算符等。有什么想法吗?

【问题讨论】:

  • Criteria 的定义是什么,Document 的定义是什么?您使用的是什么版本的 MongoDB 驱动程序。另外,您使用的是什么版本的 MongoDB 数据库?

标签: mongodb spring-boot spring-data-mongodb


【解决方案1】:

简短回答:否

Criteria 具有Querydsl 类似的语法,允许生成类型安全 查询。从Document 读取可能会为当前的 MongoDB 版本引入 MongoDB 不兼容的命令或语法

长答案:是的

我们可以使用 Java reflection 实现 walkaround 以将 Document key:value 添加到 Criteria 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;
}

现在从DocumentCriteria 创建新实例:

Criteria newCriteria = from(criteria.getCriteriaObject());

//You have full-compatible Criteria instance
newCriteria.and("foobar").elemMatch(Criteria.where("field").is("value"));

【讨论】:

    猜你喜欢
    • 2019-10-24
    • 2022-01-17
    • 2016-05-15
    • 1970-01-01
    • 2019-12-01
    • 2017-07-18
    • 1970-01-01
    • 2020-11-14
    • 2016-07-11
    相关资源
    最近更新 更多