Spring 数据 JpaRepository 方法问题中的 Pageable 和 @Param [2]

Posted

技术标签:

【中文标题】Spring 数据 JpaRepository 方法问题中的 Pageable 和 @Param [2]【英文标题】:Pageable and @Param in a spring data JpaRepository method issue [2] 【发布时间】:2014-11-16 11:35:19 【问题描述】:

我知道this 的问题,但使用org.springframework.data:spring-data-jpa:1.7.0.RELEASE 我仍然遇到同样的问题(Either use @Param on all parameters except Pageable and Sort typed once, or none at all!)。我的课是:

public interface BalanceHistoryRepository extends JpaRepository<BalanceHistory, Long> 
    @Query("select bh from BalanceHistory bh where bh.account.id = :idAccount")
    public BalanceHistory findCurrentBalanceByAccountNumber(PageRequest pageCriteira, @Param("idAccount") long idAccount);

编辑

呼叫:

 Pageable page = new PageRequest(0, 1, Sort.Direction.DESC, "date");
        BalanceHistory bh = balanceHistoryRepository.findCurrentBalanceByAccountNumber(1,page);

方法:

@Query("select bh from BalanceHistory bh where bh.account.id = :idAccount")
public BalanceHistory findCurrentBalanceByAccountNumber(@Param("idAccount") long idAccount, Pageable pageCriteira);

【问题讨论】:

如果您依赖于旧版本的 spring-data-commons 升级 spring-data-jpa 将无济于事,则该错误在 spring-data-commons 中。 那些 java.lang 的家伙需要冷静下来...... 【参考方案1】:

确保使用Pageable 而不是PageRequest,以便将第一个参数识别为不绑定到实际查询的参数。此外,您需要将返回类型更改为 PageList,因为您将返回多个结果。

public interface BalanceHistoryRepository extends CrudRepository<BalanceHistory, Long> 

  @Query("select bh from BalanceHistory bh where bh.account.id = :idAccount")
  Page<BalanceHistory> findCurrentBalanceByAccountNumber(@Param("idAccount") long idAccount, Pageable pageable);

这应该可以解决问题。请注意,我们通常不建议扩展商店特定的接口,因为它们公开了商店特定的 API,只有在真正需要时才应该公开。

【讨论】:

感谢您的意见!此更改会产生 java.lang.IllegalStateException: Method has to have one of the following return types! [interface org.springframework.data.domain.Slice, interface org.springframework.data.domain.Page, interface java.util.List] 异常。请查看我的编辑:) 修正您的退货类型。您输入了Pageable,因此结果必须是一页结果,而不是单个结果。 @Oliver:为什么参数必须是Pageable,我将参数设为PageRequest,它会抛出问题中提到的这个异常。 因为你指的是接口,而不是实现。【参考方案2】:

我在不小心导入了错误的Pageable 类时遇到了同样的异常。

如果您在存储库中也使用PageRequest,也会发生这种情况。

应该是,

import org.springframework.data.domain.Pageable;

【讨论】:

以上是关于Spring 数据 JpaRepository 方法问题中的 Pageable 和 @Param [2]的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc 的jpa JpaRepository数据层 访问方式汇总

在 spring jparepository 中加入多个表

Spring Data Query执行优化:JpaRepository中Hibernate@Query方法的并行执行

Spring 为在 @Transactional 注释方法中调用的每个 JpaRepository 方法打开一个新事务

spring boot 学习心得 使用JpaRepository注解自定义SQL查询数据库多表查询

spring data jpa中实现JpaRepository接口的repository可以返回sortedset吗?