分页出错但使用 List 工作正常

Posted

技术标签:

【中文标题】分页出错但使用 List 工作正常【英文标题】:Getting error with paging but working fine with List 【发布时间】:2021-01-12 18:55:48 【问题描述】:

我正在从事一个有两个实体的项目:学生和教师。 它遵循@ManyToOne 关系。一位教师可以有多个学生。我在运行项目时遇到了一些困难。

可分页页面 = PageRequest.of(pageNo, size)

@Query(value = "SELECT s FROM TeacherEntity s JOIN FETCH s.student d WHERE s.student IN (:students) and s.deleted = false" +
            " ORDER BY s.createdAt DESC")
Page<TeacherEntity> findByStudent(@Param("students") Collection<StudentEntity> students, Pageable pageable);

当我使用分页时,我收到此错误“FactoryBean 在创建对象时抛出异常;嵌套异常是 java.lang.IllegalArgumentException: Count query validation failed for method public abstract org.springframework.data.domain.Page”。

当我这样做而不使用这样的分页时,

@Query(value = "SELECT s FROM TeacherEntity s JOIN FETCH s.student d WHERE s.student IN (:students) and s.deleted = false" +
            " ORDER BY s.createdAt DESC")
List<TeacherEntity> findByStudentIn(@Param("students") 
Collection<StudentEntity> student); 

,它工作正常。有人可以告诉我我在做什么错吗?

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'teacherRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Count query validation failed for method public abstract org.springframework.data.domain.Page com.pro.aks.repository.TeacherRepository.findByStudent(java.util.Collection,org.springframework.data.domain.Pageable)!
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:176) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:101) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1827) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1265) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:624) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:612) ~[spring-beans-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.data.repository.config.DeferredRepositoryInitializationListener.onApplicationEvent(DeferredRepositoryInitializationListener.java:51) ~[spring-data-commons-2.3.2.RELEASE.jar:2.3.2.RELEASE]
    at org.springframework.data.repository.config.DeferredRepositoryInitializationListener.onApplicationEvent(DeferredRepositoryInitializationListener.java:36) ~[spring-data-commons-2.3.2.RELEASE.jar:2.3.2.RELEASE]

【问题讨论】:

TeacherEntity 上是否覆盖了 equals 哈希码? @SKumar 你能告诉你这里的哈希码是什么意思吗? 那么你是否重写了equals方法而不是hashcode方法?您可以将您的 TeacherEntity 发布到问题中吗? 我认为它没有问题。因为当我不使用分页并使用 List 时,代码工作得非常好 如果你没有重写这两种方法,那很好。否则,如果您没有正确定义它们,这可能是一些问题。分页将需要找到一些 x 数量的记录并且依赖于这些方法。您在该列表场景中获得正确数量的记录吗? 【参考方案1】:

您需要打印出完整的堆栈跟踪来检查错误:Count query validation failed

您需要在方法“findByStudent”中定义“countQuery”。详情请查看此链接:Spring Data and Native Query with pagination

由于方法定义(注解)错误,Spring框架无法创建对象。

背后的技术: Spring 框架会使用“countQuery”注解(HQL)生成“Raw SQL”(SQL),如果缺少该信息,则Spring 框架不知道如何统计数据。

【讨论】:

添加了堆栈跟踪 参考这个链接,改SQL可能会有帮助:***.com/questions/44647630/… 已经检查过,没有帮助。问题是为什么它在使用分页时出错而不是在使用列表时出错? 我有个建议,能不能把SQL修改成下面这个简单的SQL进行测试?一起来测试一下,一步一步找出根本原因:SELECT s FROM TeacherEntity s 您的意思是这个简单的查询有效,但您的原始查询无效?

以上是关于分页出错但使用 List 工作正常的主要内容,如果未能解决你的问题,请参考以下文章

jqGrid 不显示数据,但显示分页和列名/工作正常

分页在php中无法正常工作

pandas 编写的 Excel 公式出错,但 Excel 栏中编写的相同公式可以正常工作

使用rowcallback时,数据表行索引无法正常工作

服务器端数据表分页无法正常工作

多个 Drupal 分页器模块