我的存储库使用spring数据和JPA / Hibernate。当我扩展JpaRepository时,由于实现了PagingAndSortingRepository和CrudRepository,我会像往常一样获得许多方法。
我正在使用我的服务类中的存储库。我现在的问题是,有没有一种方法可以在服务接口内部获取存储库中的所有方法,以便服务实现类可以使用与存储库相同的方法名称将调用委派给存储库。
我想使用与存储库方法相同的方法名称,也不想直接从控制器中调用我的存储库。
我是否必须将JpaRepository,PagingAndSortingRepository和CrudRepository中的所有方法签名复制到我的服务接口中?
答案 0 :(得分:0)
如果我理解正确的问题,请首先将存储库创建为扩展JpaRepository或其他接口的接口,并且不要忘记使用@Repository注释接口。然后创建服务并将其注入存储库,以便您可以在服务中创建自己的方法(可以使用任何名称)。然后,您可以向控制器注入服务。该技术最常用。
答案 1 :(得分:0)
我认为您误解了Service
的真正含义。
Service
是处理业务逻辑的地方。它的方法应该代表业务操作,而不仅仅是数据检索/持久性。
仅仅拥有所有JpaRepository
方法并委托给Repository
是大量代码重复的秘诀,您应该避免。
根据业务需求构建Service
。
如果您认为不需要服务中间件,也许是因为仅获取/设置数据,只需在Autowire
中使用Repository
Controller
。
在Repository
中使用Controller
并不总是正确的。这取决于。
答案 2 :(得分:0)
您不需要将Repository
的方法复制到任何服务。 Spring Data JPA提供了许多强大的功能来编写自定义查询。
假设您有一个名为UserRepository
的域的User
,并且想通过他/她的电子邮件地址查找用户。无需在扩展findByEmail
的单独服务中创建UserRepository
方法,只需在UserRepository
接口内部声明即可:
User findByEmail(String email);
Spring Data JPA将为您完成所有肮脏的工作。您可以通过在UserRepository
(或其他类)中注入Controller
来调用此方法。
以上只是一个简单的例子。您甚至可以声明具有多个条件的查询:
User findByEmailOrUsername(String email, String username);
User findByEmailAndActiveTrue(String email);
List<User> findTop10ByEmail();
我建议您探索Spring Data JPA的official documentation。通过编写几行代码,您可以做很多事情。