当前位置: 首页 > 知识库问答 >
问题:

Spring data MongoDB:QueryDsl谓词和标准API互操作性

丁毅庵
2023-03-14

我将QueryDSL谓词与Spring Data MongoDB一起使用。但是,我面临的情况是,我必须将查询API与MongoTemplate一起使用(例如,筛选要从Mongo中获取的字段)。下面是一个简单的例子:

public Stream<MyModel> findSummary(Predicate predicate){
    Query query = new Query();
    query.fields.include("field1").include("field2");
    return mongoTemplate.stream(query, MyModel.class);
}

我想把谓词转换成一个标准,这样我就可以做一些类似的事情:

Query query = new Query();
query.addCriteria(XXXXX.toCriteria(predicate));
<result of left argument visit assumed to be a Criteria>.and("<path of right argument>").<operator of right argument>(<result of right argument visit>);

谢谢

伯努瓦

共有1个答案

钱星辰
2023-03-14

我遇到了同样的问题,在网上没有找到任何解决这个问题的方法。经过多次试验和错误,我已经实现了一个自定义解决方案,它在我的项目中运行良好,它可能会帮助其他人。

使用的版本:

    null
public class CustomSpringDataMongodbQuery<T> extends SpringDataMongodbQuery<T> {

    public CustomSpringDataMongodbQuery(MongoOperations operations, Class<? extends T> type) {
        super(operations, type);
    }

    @Override
    public Document createQuery(Predicate predicate) {
        return super.createQuery(predicate);
    }
}
public class DocumentCriteria implements CriteriaDefinition {

    private final Document criteriaObject;

    public DocumentCriteria(Document criteriaObject) {
        this.criteriaObject = criteriaObject;
    }

    @Override
    public Document getCriteriaObject() {
        return criteriaObject;
    }

    @Override
    public String getKey() {
        return null;
    }
}
Document document = new CustomSpringDataMongodbQuery<>(mongoTemplate, MyModel.class).createQuery(predicate);
Query query = Query.query(new DocumentCriteria(document));

带有投影的查询

如果您想使用QClass字段进行投影,那么这也是可能的。

在CustomSpringDataMongodbQuery类中,添加方法

public Query createQuery(Predicate filter, List<Path<?>> fields) {
    QTuple qTuple = Projections.tuple(fields.toArray(new Path[0]));
    return createQuery(filter, qTuple, QueryModifiers.EMPTY, Collections.emptyList());
}
public Query createQuery(Predicate filter, List<Path<?>> fields, int page, int size, List<OrderSpecifier<?>> orderSpecifiers) {
    QTuple qTuple = Projections.tuple(fields.toArray(new Path[0]));
    QueryModifiers queryModifiers = new QueryModifiers((long) size, (long) (page - 1) * size);
    return createQuery(filter, qTuple, queryModifiers, orderSpecifiers);
}

欢迎任何建议!!

 类似资料:
  • 问题内容: 我有以下用于构建条件构建器的标准代码段。 我想知道有什么方法可以使它更好,因为我将更多地使用条件和相同条件来获取记录数。 任何见解都是高度赞赏的 问题答案: 首先,您必须考虑以分层方式重组应用程序。您至少需要3层,DAO,Service和WebService。 有关数据库和JPA的所有内容都必须在您的DAO层中。并且所有与json相关的事物都必须在您的WebService层中。您的服务

  • 我使用JPA2.1、Spring数据和CriteriaBuilder、谓词对我的JPA实体进行查询。我有一个父实体InvoiceSummary,它与名为ShipmentStop的子实体有@OneToMany关系。我想在子实体ShipmentStop上设置条件,但不确定如何进行。我还希望能够同时在父表和子表上设置条件。有没有一种方法可以使用谓词来实现这一点?例如,我想按子实体的departureDa

  • 本文向大家介绍ANTLR 动作和语义谓词,包括了ANTLR 动作和语义谓词的使用技巧和注意事项,需要的朋友参考一下 示例 词法分析器操作是目标语言中由{...包围的任意代码块,该代码}在匹配期间执行: 语义谓词是目标语言中由{...包围的任意代码块}?,其结果为布尔值。如果返回的值为false,则跳过词法分析器规则。 出于性能原因,应尽可能在规则末尾定义语义谓词。

  • 谓词是指用方括号写的XPath表达式。 它指的是为某些条件限制节点集中的选定节点。 例如, 序号 序号 描述 1 选择第一个元素,它是元素的子元素。 2 选择最后一个元素,它是元素的子元素。 3 使用选择元素。 4 选择大于的元素。 示例 此示例通过迭代每个学生创建一个包含其详细信息的元素。 它计算节点的位置,然后打印学生的详细信息以及序列号。 文件:students.xml - 文件:stude

  • 谓词 Clojure 提供了很多函数来充当谓词的功能 — 测试条件是否成立。它们的返回值是 true或者false。在Clojure里面 false 以及 nil 被解释成false. true 以及任何其他值都被解释成true, 包括0。谓词函数的名字一般以问号结尾。 反射是一种获取一个对象的特性,而不是它的值的过程。比如说对象的类型。有很多谓词函数进行反射。 测试一个对象的类型的谓词包括 cl

  • Predicates是评估条件并提供true或false值的函数。 我们在数字章节的例子中看到了谓词函数。 我们看过像'even?'这样的功能 用来测试一个数字是否是偶数,或'neg?' 用于测试数字是否大于零。 所有这些函数都返回true或false值。 以下是Clojure中谓词的示例。 (ns clojure.examples.example (:gen-class)) ;; This