Java 在spring boot mongodb中使用方法查询时,如何为所有查询添加默认查询条件

Java 在spring boot mongodb中使用方法查询时,如何为所有查询添加默认查询条件,java,spring,mongodb,spring-boot,mongodb-query,Java,Spring,Mongodb,Spring Boot,Mongodb Query,我需要对给定的mongo数据库执行方法查询并检索数据。但为此,我必须检查字段delete=false(软删除)是否用于所有查询 它可以通过以下类型的查询来实现 例如:可选findbyidandeletedisfalse(字符串id) 但是正如您所看到的,我们必须为所有查询设置DeletedIsFalse。 我尝试了中提供的答案,但我发现只有在我们直接使用mongo模板运行查询时才能使用它 经过一些调试后,我发现即使方法查询是通过Mogno模板执行的,它们也使用包保护的类和方法来执行。因此它们不能

我需要对给定的mongo数据库执行方法查询并检索数据。但为此,我必须检查字段
delete=false
(软删除)是否用于所有查询

它可以通过以下类型的查询来实现

例如:
可选findbyidandeletedisfalse(字符串id)

但是正如您所看到的,我们必须为所有查询设置
DeletedIsFalse
。 我尝试了中提供的答案,但我发现只有在我们直接使用mongo模板运行查询时才能使用它

经过一些调试后,我发现即使方法查询是通过Mogno模板执行的,它们也使用包保护的类和方法来执行。因此它们不能被继承的类重写。 我找不到执行它们的入口点,也找不到为方法查询注入默认条件的位置

例如:如果我们检查
MongoTemple
的实现,最后执行是通过一个方法进行的

List doFind(字符串集合名称、文档查询、文档字段、类sourceClass、类targetClass、游标准备器准备器)
该方法是从名为
ExecutableFindOperationSupport
的内部类调用的。所有这些类都是包保护的

有没有理由让它们受到包保护,而不给它们从继承类重写的机会?
还有没有其他方法可以使用默认条件运行方法查询,而不将它们附加到所有查询中?

正如我在上一个问题中所建议的那样,扩展
MongoTemplate的主要问题是需要覆盖许多方法,因为MongoTemplate在其内部工作中使用了所有方法。这种方式既不灵活也不健壮

我想给你推荐另一个解决方案。您可以实现在调用
MongoTemplate
方法之前执行某些代码的方面。您只需将附加条件添加到
MongoTemplate
接收的每个查询中

spring boot starter aop
添加到依赖项中。在配置类中启用AOP:

@Configuration
@EnableAspectJAutoProxy
public class AspectConfiguration {
}
并实施一个小方面来完成所有工作:

@Aspect
@Component
public class RepositoryAspect {
    @Before("execution(* org.springframework.data.mongodb.core.MongoTemplate.*(..))()")
    public void before(JoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if (arg instanceof Query) {
                Query query = (Query) arg;
                // add your criteria to the query
                return;
            }
        }
    }
}

但请记住,这种方法可能会导致执行查询的不良性能。如果你建立了一个高负载系统,那么设置你的标准是更好的方法——这是快速工作的成本。

谢谢你的回答。我来检查一下。但正如您所提到的,我们正在计划高负载。因此,最好权衡开发人员的努力,以维护软删除。但是我们知道为什么这些方法是包私有的吗。我认为它应该能够继承。这是一种设计决策吗?@IrunikaLakmalWeeraratne此方法似乎只在
可执行FindOperationSupport.ExecutableFindSupport
中使用,其他任何地方都不使用。此类和MongoTemplate都在包
org.springframework.data.mongodb.core
中。因此,将该方法作为包私有看起来确实像是一个设计决策。无论如何,您也可以在项目中创建该包,并在其中使用重写的方法实现MongoTemplate。这是可能的,因为
spring data mongo.jar
不是一个密封的jar,一个包的类可以位于不同的位置-在库和应用程序中。谢谢将根据我们的要求坚持使用mongo模板。