我遇到了同样的问题,但在互联网上没有找到任何解决方案。经过许多尝试和错误,我实现了一个自定义解决方案,在我的项目中工作良好,可能会帮助其他人。
注意事项
使用的版本:
- 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;
}
}
现在你可以使用这两个类从谓词(Predicate)中获取查询(Query)。
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谓词和Spring Data Mongodb查询相互配合的人。欢迎任何建议!