为什么Spring Data的MongoRepository如此有限?

时间:2013-07-23 05:51:11

标签: java spring mongodb spring-data-mongodb

所以我注意到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太无关紧要了吗?

3 个答案:

答案 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 patternRepository是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