Spring数据Mongodb:QueryDsl谓词和准则API互操作性



我将QueryDSL谓词与Spring Data Mongodb一起使用。然而,我面临的情况是,我必须使用带有MongoTemplate的Queryneneneba API(例如,过滤要从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的简单"one_answers"运算符(com.mysyma.query.ttypes.Operation#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谓词和Spring Data Mongodb Query互操作的方法吗?

感谢

Benoit

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

注意

使用的版本:

  • 弹簧数据mongodb-3.0.2.RELEASE
  • querydsl-4.3.1

实施

首先创建一个扩展org.springframework.data.mongodb.repository.support.SpringDataMongodbQuery&使用public修饰符覆盖createQuery(Predicate predicate)方法。

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());
}

并传递Path(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谓词和SpringDataMongodbQuery互操作的人。

欢迎任何建议!!

最新更新