gpt4 book ai didi

spring-data-mongodb - Spring 数据 Mongodb : QueryDsl Predicate and Criteria API interoperability

转载 作者:行者123 更新时间:2023-12-04 11:12:13 24 4
gpt4 key购买 nike

我在 Spring Data Mongodb 中使用 QueryDSL 谓词。但是,我面临着必须将 Query 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));

但是我找不到这样的实用程序类。

我发现可以访问 QueryDSL 谓词,因此我开始实现自定义访问者 (com.mysema.query.types.Visitor) 但 Criteria API 不是为此目的而设计的:例如实现简单的“和”运算符QueryDSL (com.mysema.query.types.Ops#AND) 必须变成类似
<result of left argument visit assumed to be a Criteria>.and("<path of right argument>").<operator of right argument>(<result of right argument visit>);

有人可以建议一种使 QueryDSL Predicates 和 Spring Data Mongodb Query 互操作的方法吗?

谢谢

贝努瓦

最佳答案

我遇到了同样的问题,并没有在互联网上找到任何解决此问题的方法。经过多次反复试验,我已经实现了一个在我的项目中运行良好的自定义解决方案,它可能会帮助其他人。
备注
使用的版本:

  • spring-data-mongodb - 3.0.2.RELEASE
  • querydsl - 4.3.1

  • 实现
    首先创建一个 的类扩展 org.springframework.data.mongodb.repository.support.SpringDataMongodbQuery & 覆盖 createQuery(Predicate predicate)方法与 public 修饰符。
    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);
    }
    }
    现在创建一个类 工具 org.springframework.data.mongodb.core.query.CriteriaDefinition .
    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());
    }
    并传递路径(QClass 字段)列表以及谓词
    使用投影和分页查询
    您可以使用添加分页到上述方法
    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);
    }
    希望这可以帮助每个想要使 QueryDSL Predicates 和 Spring Data Mongodb Query 互操作的人。
    欢迎任何建议!!

    关于spring-data-mongodb - Spring 数据 Mongodb : QueryDsl Predicate and Criteria API interoperability,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33912926/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com