我定义了一个Spring Data 存储库,如下所示:
public interface InvoiceRepository extends JpaRepository<Invoice, Long> {
@Query(value = "select i.id as id, " +
"i.invoiceStatus as invoiceStatus, " +
"(select sum(r.id) from Invoice r ) as paid " +
"from Invoice i ")
Page<InvoiceQuery> getInvoicesByStatusAndName(Pageable pageable);
}
上面给出的子查询不是真正的子查询,但是这个简单的查询有助于重现问题。
当我的springboot(2.4.5)应用程序启动时,我得到了以下异常
原因:java. lang.非法参数异常:org.hibernate.hql.internal.ast.QuerySyntaxException:应为EOF,但在第1行第62列附近找到")"[从公司. anish. webacc. orm. entities.发票中选择计数(r)作为从公司. anish. webacc. orm. entities.发票i中支付的计数(r)],地址为组织. hib. internal.异常转换器实现. convert(异常转换器实现. java:138)~[ hib- core-5.4.30.Final.jar:5.4.30.Final]
现在如果我改变
Page<InvoiceQuery> getInvoicesByStatusAndName(Pageable pageable);
到
List<InvoiceQuery> getInvoicesByStatusAndName(Pageable pageable);
那么它就能完美地工作(没有分页部分)。
InvoiceQuery是一个投影接口-
public interface InvoiceQuery {
Long getId();
InvoiceStatus getInvoiceStatus();
Double getPaid();
}
生成的查询似乎不正确-出于某种原因,我怀疑子查询中的对句导致了该问题。如果删除子查询,则不会出现问题
这是我第一次尝试做分页,所以我可能会做一些非常愚蠢的在这里-任何帮助将不胜感激。
thx-茴香
2条答案
按热度按时间uujelgoq1#
问题是当你使用内部查询的时候Spring Data JPA是不能派生计数查询的。当你想要返回类型为Page,Page -有总页数和总元素作为它返回的两个东西和分页结果。
因此,要获得这两个信息,即满足条件的元素总数和给定页面大小的页面总数,它必须派生一个count()查询,在您的情况下,它无法派生该count()查询。您可以在“@Query”注解中显式指定count查询。
aamkag612#
countQuery是最好的方法,但它意味着对数据库多一个事务,并且可能会花费很大的成本,最大值取决于您在数据库中查找的数据量