所以我注意到Spring Data的MongoTemplate有很多不同类型的“保存对象”操作,比如save,upsert,insert和updateFirst。
另一方面,Spring Data的MongoRepository接口有一个持久化方法:“save”。现在,显然,如果我想要创建/更新/ upsert功能,我可以很容易地实现它们。在调用“save”之前先做一个get,然后检查实体是否存在。但看起来很奇怪,MongoTemplate有如此多样的选项(我甚至无法弄清楚保存和upsert之间的区别是什么),但是Spring Data的回购是如此有限。如果您要使用创建/更新语义,或者get + null check + repository.save与mongoTemplate之间存在差异,您认为使用Spring Data MongoRepositories而不自定义其方法是浪费/懒惰吗? .insert太无关紧要了吗?
答案 0 :(得分:5)
您可以使用XXXRepositoryCustom自定义您自己的存储库并为其编写实现。
以下是一个例子:
public interface AccountRepository extends MongoRepository<Account, String>, AccountRepositoryCustom{
@Query("{ 'email' : ?0 }")
Account findByEmail(String email);
}
请注意,上面的接口扩展了您自己的AccountRepositoryCustom接口。
然后定义自己的AccountRepositoryCustom:
public interface AccountRepositoryCustom {
public boolean updateAccountToken(String id, String token);
}
接下来,为它编写一个实现:
public class AccountRepositoryCustomImpl implements AccountRepositoryCustom {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public boolean updateAccountToken(String id, String token) {
// your code
}
}
答案 1 :(得分:0)
Spring Data跟随repository pattern。 Repository
是DAO层的抽象,用于通用存储和检索域实体。在存储库层的底部有DAO层部分,其中使用了MongoTemplate
。
因此Repository
具有逻辑保存方法。从域的角度来看,您不应该关心域实体是如何持久存在的。您只需调用保存方法,MongoTemplate
的使用情况取决于MongoRepository
实施。
答案 2 :(得分:0)
Han Wang的回答是正确的,但是Impl应该被命名为AccountRepositoryImpl而不是AccountRepositoryCustomImpl
见上一个问题/答案:No property found for type error when try to create custom repository with Spring Data JPA