如何自定义MongoRepository而不覆盖接口中带注释的@Query方法?

时间:2013-06-09 06:19:08

标签: mongodb repository spring-data-mongodb

我想通过添加一个方法来自定义MongoRepository,并且仍然使用MongoRepository提供的实现方法。以下是代码:

public interface TopoRepositoryInterface extends MongoRepository<Topo, String>
{
    @Query("{'name':?0}")
    public Topo findByName(String name);

    public long getPublishedTopoCount();
}

实施声明是:

public class TopoRepositoryImpl extends SimpleMongoRepository<Topo, String> implements TopoRepositoryInterface

如果没有自定义,可以通过添加@Query(“{'name':?0}”)注释自动实现TopoRepositoryInterface中声明的方法findByName。但是现在,由于存在接口继承,我必须添加代码

@Override
public Topo findByName(String name)
{
    Topo topo = getMongoOperations().findOne(Query.query(Criteria.where("name").is(name)), Topo.class);
    return topo;
}

有没有办法只为getPublishedTopoCount()编写自己的代码,并且让@Ban注释实现findByName()?非常感谢你。

1 个答案:

答案 0 :(得分:3)

您必须将存储库接口拆分为两个。

第一个 - 包含您手动实现的方法的“自定义”将是:

public interface TopRepositoryCustom {
    long getPublishedTopoCount();
}

生成方法的第二个:

public interface TopRepository extends MongoRepository<Topo, String>, TopRepositoryCustom {
    @Query("{'name':?0}")
    Topo findByName(String name);  
}

然后你只需要实现第一个存储库并记住遵循正确的命名约定。有关详情,请参阅:spring-data mongodb custom implementation PropertyReferenceExceptionSpring Data MongoDB Custom implementations reference