我需要编写一个应用程序,可以使用spring-data和mongodb进行复杂的查询。我一直从使用MongoRepository开始,但是在复杂的查询中苦苦寻找实例或真正理解语法。
我说的是这样的查询:
@Repository public interface UserRepositoryInterface extends MongoRepository<User, String> { List<User> findByEmailOrLastName(String email, String lastName); }
或使用基于JSON的查询,但由于语法不正确,因此尝试并尝试了它。即使在阅读了mongodb文档之后(由于语法错误,仍无法正常工作的示例)。
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?两者都是成熟的,还是其中一个比另一个缺少更多的功能?
mongoTemplate
MongoRepository
“方便”和“使用功能强大”在某种程度上与目标背道而驰。到目前为止,存储库比模板方便得多,但是后者当然可以为你提供对执行内容的更细粒度的控制。
由于存储库编程模型可用于多个Spring Data模块,因此你可以在Spring Data MongoDB 参考文档的常规部分中找到有关它的更多详细文档。
TL; DR
我们通常建议采用以下方法:
从存储库摘要开始,仅使用查询派生机制或手动定义的查询声明简单查询。 对于更复杂的查询,将手动实现的方法添加到存储库中(如此处所述)。供实现使用MongoTemplate。 细节
对于你的示例,这看起来像这样:
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 UserRepository extends CrudRepository<User, Long>, CustomUserRepository { }