如何使 Spring Boot JpaRepository 存储库方法可定位?

How can I make a Spring Boot JpaRepository repository method pegeable?

我正在使用 Spring Data JPA 和 Hibernate 进行 Spring 启动,我在尝试使存储库方法可分页时遇到以下问题。

如果我使用诸如 findAll() 之类的方法,则使其可 pegaeable 非常简单。例如,我有这个服务方法,我调用 findAll() 存储库方法将 Pageable 对象传递给它:

@Override
public Page<WalletDTO> getAllWalletsList(Pageable pageable) throws NotFoundException {
    
    Page<Wallet> walletsList = this.walletRepository.findAll(pageable);
    
    if(walletsList.isEmpty()) {
        throw new NotFoundException(String.format("There are no wallet in the whole system !!!"));
    }
        
    return walletsList.map(m -> conversionService.convert(m, WalletDTO.class));

}

完美运行。

但现在我有了这个存储库界面:

public interface WalletRepository extends JpaRepository<Wallet, Integer> {
    
    List<Wallet> findByUser_Id(Integer id);
    
    List<Wallet> findByWalletType_Name(String walletName);
    
    List<Wallet> findByWalletType_WalletType(WalletType walletType, Pageable pageable);
    
    Wallet findByAddress(String address);   

}

我该怎么做才能使方法可识别,我正在尝试做这样的事情:

List<Wallet> findByWalletType_WalletType(WalletType walletType, Pageable pageable);

但我不知道这是否可以解决。实现此行为的正确方法是什么?

此外,您可以 return Page<T>Slice<T>,而不是直接 return 输入您的类型。主要区别在于页面将触发额外的计数(例如用于显示寻呼机),而切片只知道是最后一个(用于无限滚动)。

根据spring doc

We also provide persistence technology-specific abstractions, such as JpaRepository or MongoRepository. Those interfaces extend CrudRepository and expose the capabilities of the underlying persistence technology in addition to the rather generic persistence technology-agnostic interfaces such as CrudRepository.

On top of the CrudRepository, there is a PagingAndSortingRepository abstraction that adds additional methods to ease paginated access to entities

因此,通过扩展 JpaRepository,您已经继承了 PagingAndSortingRepository,并且您可以公开带有分页的方法,这些方法将由 Spring 自动实现。

同样根据spring doc你有下面的例子,这些例子将由Spring数据JPA

自动实现

Example 14. Using Pageable, Slice, and Sort in query methods

Page findByLastname(String lastname, Pageable pageable);

Slice findByLastname(String lastname, Pageable pageable);

List findByLastname(String lastname, Pageable pageable);

所以在你的情况下你会有以下选择

Page<Wallet> findByWalletType_WalletType(WalletType walletType, Pageable pageable);

Slice<Wallet> findByWalletType_WalletType(WalletType walletType, Pageable pageable);

List<Wallet> findByWalletType_WalletType(WalletType walletType, Pageable pageable);

阅读文档了解更多详情,选择一个你喜欢的,你应该会很好!

最后一个提示。为了使您已经声明的名称 WalletType_WalletType 起作用,这意味着 Wallet 有一个名为 WalletType 的字段,然后 WalletType 也有一个名为 WalletType 的字段。这似乎有点奇怪。