我将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>);
谢谢
伯努瓦
我遇到了同样的问题,在网上没有找到任何解决这个问题的方法。经过多次试验和错误,我已经实现了一个自定义解决方案,它在我的项目中运行良好,它可能会帮助其他人。
注
使用的版本:
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