我们可以在同一个应用程序中同时使用 MongoRepository 和 MongoTemplate

spr*_*ner 5 spring-data mongodb-query spring-data-mongodb

我需要在 MongoDB 上编写一些复杂的查询和一些简单的查询。我可以将 MongoRepository 用于简单查询,将 MongoTemplate 与 Query 或 Criteria 一起用于复杂查询实现相同的应用程序。

在相同的应用程序中同时使用 MongoTemplate 和 MongoRepositories 是否是好的设计。这种方法有什么缺点吗。

还有什么是编写包含大量谓词的复杂查询的最佳方法,这些谓词涉及和,或,IN 和 Not In 在单个查询中。

Ant*_*ksh 7

尽管 MongoRepository 比 MongoTemplate 使用起来简单得多,但模板可以让您对正在实施的查询进行更细粒度的控制。

话虽如此,您仍然可以像这样使用 MongoRepository 实现复杂的查询:

@Query("{'id': ?#{ [0] ? {$exists :true} : [1] }}")
List<Person> findByQueryWithExpressionAndNestedObject(boolean param0, String param1);
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这里找到

但作为一种实践,在你的代码中同时拥有两者实际上是好的,那就是

  1. 当您想使用已经实现的存储库时,请使用存储库。
  2. mongo-template当您想要实现具有复杂逻辑的 customMethod 时,请使用 手动实现一些自定义方法。

执行

第1步:

interface CustomEmployeeRepository{
    List<Employee> CustomEmployeeMethod(String field)
}
Run Code Online (Sandbox Code Playgroud)

第2步 :

@Repository
public class CustomEmployeeRepositoryImpl implements CustomEmployeeRepository{

    @Autowired
    private MongoTemplate mongotemplate;

    @Override
    List<Employee> CustomEmployeeMethod(String field){
    
    }
}
Run Code Online (Sandbox Code Playgroud)

第 3 步:现在创建一个新的存储库扩展MongoRepositoryCustomEmployeeRepository使用自定义实现以及存储库的预定义方法。

interface EmployeeRepository extends MongoRepository<Employee, long>, CustomEmployeeRepository{
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以两全其美。有关实现的更多信息,请参阅文档。希望这可以帮助。

  • CustomEmployeeRepositoryImpl 应使用 @Repository 进行注释以获得有效的 mongoTemplate (2认同)