您不需要实际实现 GraphRepository 而是扩展它。 Spring-Data 的原则是所有样板 CRUD 代码都得到处理(通过在启动时代理)所以你所要做的就是为扩展 GraphRepository 的特定实体创建一个接口,然后只添加你的特定方法需要。
例如;如果我有一个实体 CustomerNode,要创建标准 CRUD 方法,我可以创建一个新接口 CustomerNodeRepository extends GraphRepository<CustomerNode,Long>。 GraphRepository 中的所有方法(例如 save、findAll、findOne、delete、deleteAll 等)现在都可以从 CustomerNodeRepository 访问并由 Spring-Data-Neo4J 实现,而无需编写一行实现代码。
该模式现在允许您处理特定的存储库代码(例如 findByNameAndDateOfBirth),而不是简单的 CRUD 内容。
Spring-Data 包对于存储库交互非常有用。它可以减少大量代码(代码行减少了 80% 以上),强烈推荐使用它
编辑:实现自定义执行
如果您想将自己的自定义行为添加到 Repository 方法,您需要创建合并接口和自定义实现的概念。例如,假设我想创建一个名为 findCustomerNodeBySomeStrangeCriteria 的方法,为此,我实际上想链接到关系数据库以执行该功能。
首先,我们定义一个单独的、独立的接口,仅包含我们的“额外”方法。
public interface CustomCustomerNodeRepository {
List<CustomerNode> findCustomerNodeBySomeStrangeCriteria(Object strangeCriteria);
}
接下来我们更新我们的普通接口,不仅可以扩展 GraphRepository,还可以扩展我们的新自定义接口
public interface CustomerNodeRepository extends GraphRepository<CustomerNode,Long>, CustomCustomerNodeRepository {
}
最后一部分,是实际实现我们的findCustomerNodeBySomeStrangeCriteria 方法
public class CustomerNodeRepositoryImpl implements CustomCustomerNodeRepository {
public List<CustomerNode> findCustomerNodeBySomeStrangeCriteria(Object criteria) {
//implementation code
}
}
所以,有几点需要注意;
- 我们创建了一个单独的接口来定义任何具有自定义实现的自定义方法(不同于 Spring-Data 兼容的“findBy...”方法)
- 我们的 CustomerNodeRepository 接口(我们的“主”接口)扩展了 GraphRepository和我们的“自定义”接口
- 我们在实现仅自定义接口的类中实现仅“自定义”方法
- “自定义”实现类必须(默认)称为我们的“主”接口
Impl 才能被 Spring Data 拾取(因此在本例中为CustomNodeRepositoryImpl)
在幕后,Spring Data 提供了 CustomerNodeRepository 的代理实现,作为自动构建的 GraphRepository 和实现 CustomCustomerNodeRepository 的类的合并。类名的原因是允许 Spring Data 轻松/成功地拾取它(这个 可以 被覆盖,因此它不会寻找 *Impl)