hibernate 具有可分页和子查询的Spring JPA导致查询语法错误

ne5o7dgx  于 2023-02-16  发布在  Spring
关注(0)|答案(2)|浏览(132)

我定义了一个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-茴香

uujelgoq

uujelgoq1#

问题是当你使用内部查询的时候Spring Data JPA是不能派生计数查询的。当你想要返回类型为Page,Page -有总页数和总元素作为它返回的两个东西和分页结果。

int getTotalPages();

    long getTotalElements();

因此,要获得这两个信息,即满足条件的元素总数和给定页面大小的页面总数,它必须派生一个count()查询,在您的情况下,它无法派生该count()查询。您可以在“@Query”注解中显式指定count查询。

@Query(value = "select new com.example.package.InvoiceQuery(i.id as id,i.invoiceStatus as invoiceStatus,(select sum(r.id) from Invoice r ) as paid ) from Invoice i",
 countQuery = "select count(*) from Invoice")
    Page<InvoiceQuery> getInvoicesByStatusAndName(Pageable pageable);
aamkag61

aamkag612#

countQuery是最好的方法,但它意味着对数据库多一个事务,并且可能会花费很大的成本,最大值取决于您在数据库中查找的数据量

相关问题