我认为最好的方法是扩展 MongoTemplate 类,它将您的 deleted=false 条件添加到所有 Find 查询。
下面是一个示例,说明如何使用一种用于执行findOne 查询的方法:
public class ExtendedMongoTemplate extends MongoTemplate {
private static final Document DELETED_CRITERIA_DOC = Criteria.where(Constants.DELETED).is(false)
.getCriteriaObject();
@Override
protected <T> T doFindOne(
String collectionName,
Document query,
Document fields,
CursorPreparer preparer,
Class<T> entityClass) {
query.putAll(DELETED_CRITERIA_DOC);
return super.doFindOne(collectionName, query, fields, preparer, entityClass);
}
...
}
该方法在方法doFindOne(Query query, Class<?> entityClass)中调用(最后一个委托执行
其他要覆盖的方法是:
protected <S, T> List<T> doFind(String collectionName, Document query, Document fields,
Class<S> entityClass, CursorPreparer preparer);
protected <T> T doFindAndRemove(String collectionName, Document query, Document fields,
Document sort, @Nullable Collation collation, Class<T> entityClass);
protected <T> T doFindAndModify(String collectionName, Document query, Document fields, Document sort,
Class<T> entityClass, UpdateDefinition update, @Nullable FindAndModifyOptions options);
protected <T> T doFindAndReplace(String collectionName, Document mappedQuery, Document mappedFields,
Document mappedSort, com.mongodb.client.model.Collation collation, Class<?> entityType,
Document replacement, FindAndReplaceOptions options, Class<T> resultType);
这些方法在低级别执行查询,因此它们接受带有查询条件的 BSON 文档,而不是 Spring 的条件。如果您这样做,Find-methods 将为您的所有查询添加附加条件。
你也可以用类似的方式覆盖方法findOne、find、findAndModify等等,但是有很多这些方法都使用doFind*方法。因此覆盖doFind* 将导致使用所有查找查询。并且不要忘记覆盖findById(它也在内部使用doFindOne)。
顺便说一句,@Where 注解来自 Hibernate,但 Spring Data Mongo 不使用它们。它需要自己的注释才能与您的实体一起使用。