我正在研究Spring Data JPA . 考虑下面的示例,我将默认使用所有crud和finder功能,如果我想自定义查找器,那么也可以在界面本身轻松完成 .
@Transactional(readOnly = true)
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("<JPQ statement here>")
List<Account> findByCustomer(Customer customer);
}
我想知道如何为上述AccountRepository添加一个完整的自定义方法及其实现?由于它的接口我无法在那里实现该方法 .
9 回答
您需要为自定义方法创建单独的界面:
并为该接口提供实现类:
See also:
4.6 Custom Implementations for Spring Data Repositories
请注意,命名方案在不同版本之间已更改 . 有关详细信息,请参阅https://stackoverflow.com/a/52624752/66686 .
考虑到您的代码段,请注意您只能将Native对象传递给findBy ###方法,假设您要加载属于某些客户的帐户列表,一个解决方案就是这样做,
make sue要查询的表的名称与Entity类相同 . 如需进一步实施,请查看this
我扩展了SimpleJpaRepository:
并将此类添加到@EnableJpaRepositoryries repositoryBaseClass .
我使用以下代码从我的自定义实现访问生成的查找方法 . 通过bean工厂实现实现可以防止循环bean创建问题 .
这在使用上受到限制,但对于简单的自定义方法,您可以使用 default 接口方法,例如:
编辑:
在this spring教程中写道:
所以甚至可以只声明方法:
如果object
Hobby
是Customer的属性,那么Spring将自动为您定义方法 .如果您希望能够执行更复杂的操作,则可能需要访问Spring Data的内部,在这种情况下,以下工作(作为我对DATAJPA-422的临时解决方案):
这里还有另一个问题需要考虑 . 有些人希望在您的存储库中添加自定义方法会在“/ search”链接下自动将它们公开为REST服务 . 遗憾的是,情况并非如此 . Spring目前不支持 .
这是'按设计'功能,spring data rest显式检查方法是否为自定义方法,并且不将其公开为REST搜索链接:
这是Oliver Gierke的qoute:
有关详细信息,请参阅此问题:https://jira.spring.io/browse/DATAREST-206
接受的答案有效,但有三个问题:
在将自定义实现命名为
AccountRepositoryImpl
时,它使用未记录的Spring Data功能 . documentation明确指出它必须被称为AccountRepositoryCustomImpl
,自定义接口名称加上Impl
你不能使用构造函数注入,只有
@Autowired
,这被认为是不好的做法在自定义实现中有一个循环依赖(这就是你不能使用构造函数注入的原因) .
我发现了一种使其完美的方法,尽管不是没有使用另一个未记录的Spring Data功能:
除了axtavt的answer之外,不要忘记如果需要它来构建查询,可以在自定义实现中注入Entity Manager: