我需要编写一个应用程序,我可以使用 spring-data 和 mongodb 进行复杂的查询。我从使用 MongoRepository 开始,但在查找示例或实际理解语法时遇到了复杂的查询。
我说的是这样的查询:
@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
List<User> findByEmailOrLastName(String email, String lastName);
}
或使用基于 JSON 的查询,我通过反复试验尝试过,因为我没有正确理解语法。即使在阅读了 mongodb 文档之后(由于语法错误导致的非工作示例)。
@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
@Query("'$or':[{'firstName':{'$regex':?0,'$options':'i'}},{'lastName':{'$regex':?0,'$options':'i'}}]")
List<User> findByEmailOrFirstnameOrLastnameLike(String searchText);
}
通读所有文档后,似乎 mongoTemplate
的文档比 MongoRepository
要好得多。我指的是以下文档:
http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/
你能告诉我用什么更方便、更强大吗? mongoTemplate
还是 MongoRepository
?两者都一样成熟还是其中一个比另一个缺少更多功能?
最佳答案
“方便”和“使用强大”在某种程度上是相互矛盾的目标。存储库比模板方便得多,但后者当然可以让您更精细地控制要执行的内容。
由于存储库编程模型可用于多个 Spring Data 模块,您可以在 Spring Data MongoDB reference docs 的常规部分找到更深入的文档。 .
TL;DR
我们一般推荐以下方法:
MongoTemplate
。详情
对于您的示例,这看起来像这样:
为您的自定义代码定义一个接口(interface):
interface CustomUserRepository {
List<User> yourCustomMethod();
}
为这个类添加一个实现并遵循命名约定以确保我们可以找到这个类。
class UserRepositoryImpl implements CustomUserRepository {
private final MongoOperations operations;
@Autowired
public UserRepositoryImpl(MongoOperations operations) {
Assert.notNull(operations, "MongoOperations must not be null!");
this.operations = operations;
}
public List<User> yourCustomMethod() {
// custom implementation here
}
}
现在让您的基础存储库接口(interface)扩展自定义接口(interface),基础架构将自动使用您的自定义实现:
interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository {
}
通过这种方式,您基本上得到了选择:所有易于声明的内容都进入 UserRepository
,所有更好地手动实现的内容都进入 CustomUserRepository
。自定义选项记录在 here .
关于java - Spring Data 的 MongoTemplate 和 MongoRepository 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17008947/