当前位置: 首页 > 知识库问答 >
问题:

如何在Spring JpaRepository中使用自定义DTO进行可分页响应

李和昶
2023-03-14

我想编写一个Spring数据JPA查询,用于在自定义DTO类中获取可分页响应。但我得到了一个例外。下面是存储库中的代码。

@Query("SELECT new com.xxx.xxx.dto.corporate.RentOrRideDetails(c.corpRideId, " +
        "c.corporateRidePackage.corporate.corporateName, c.timeStamp, c.pickLongitude, c.pickLatitude, " +
        "c.pickupStreet, c.pickupDateTime, c.dropLongitude, c.dropLatitude, c.dropDateTime, c.dropStreet," +
        "c.calculatedDistance, c.actualDistance, c.rideStatus, c.corporateRidePayment.paymentType)" +
        "FROM CorporateRide c")
Page<RentOrRideDetails> getAllRidesWithCustomDetails(Pageable pageable);

当我将return type从页面替换为列表,但我需要一个可分页的响应时,这就起作用了。

例外情况

Caused by: java.lang.IllegalArgumentException: Count query validation failed for method public abstract org.springframework.data.domain.Page com.ceyentra.liontours.repository.corporate.ride.CorporateRideRepository.getAllRidesWithCustomDetails(org.springframework.data.domain.Pageable)!
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:93) ~


Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: select near line 1, column 360 [SELECT new com.xxx.xxx.dto.corporate.RentOrRideDetails(c.corpRideId, c.corporateRidePackage.corporate.corporateName, c.timeStamp, c.pickLongitude, c.pickLatitude, c.pickupStreet, c.pickupDateTime, c.dropLongitude, c.dropLatitude, c.dropDateTime, c.dropStreet,c.calculatedDistance, c.actualDistance, c.rideStatus, c.corporateRidePayment.paymentType)select count(c) FROM com.ceyentra.liontours.entity.corporate.ride.CorporateRide c]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:718) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_144]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:350) ~[spring-orm-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at com.sun.proxy.$Proxy112.createQuery(Unknown Source) ~[na:na]
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87) ~[spring-data-jpa-2.1.10.RELEASE.jar:2.1.10.RELEASE]
... 71 common frames omitted

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: select near line 1, column 360 [SELECT new com.xxx.xxx.dto.corporate.RentOrRideDetails(c.corpRideId, c.corporateRidePackage.corporate.corporateName, c.timeStamp, c.pickLongitude, c.pickLatitude, c.pickupStreet, c.pickupDateTime, c.dropLongitude, c.dropLatitude, c.dropDateTime, c.dropStreet,c.calculatedDistance, c.actualDistance, c.rideStatus, c.corporateRidePayment.paymentType)select count(c) FROM com.ceyentra.liontours.entity.corporate.ride.CorporateRide c]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:297) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:155) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:600) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:709) ~[hibernate-core-5.4.5.Final.jar:5.4.5.Final]
... 79 common frames omitted

共有1个答案

唐昊焜
2023-03-14

可以使用CriteriaBuilder手动分页,返回List而不是Page

 类似资料:
  • 问题内容: 我一直在寻找一个好的教程来教我如何使用简单的DataBound控件(如Repeater)来制作自定义的Paging控件,以实现高性能的分页功能。 我找到了很多有关该问题的文章,但没有一个是完整的答案。 ASP.NET中大型结果集的分页 这是一个了不起的工具,它具有统计信息,并且在不同方法之间进行了很好的比较,但是问题在于,在SQL Server使用新功能ROW_NUMBER()之前,它

  • 因此,我已经使用标准的Spring Data JPA接口完成了这项工作,该接口扩展了PagingAndSortingRepository,以便为REST API实现分页和排序。问题是,现在我想实现同样的事情,但现在只使用普通的JPA,到目前为止,我成功地让我的API分页,但排序根本不起作用。每次尝试设置参数(使用pageable.getsort()从可分页对象中),都会以查询错误结束(如果只是发送

  • 问题内容: 我有一个页面,它执行一个自定义查询,该查询已保存在数据库中的某个位置。我需要能够在gridview上启用分页。 例如,查询保存在数据库中的方式如下: 这将返回10,000行。 使用下面的方法,我使它返回10行。 这是绑定网格的代码 问题在于查询本身返回10行,因此gridview将永远不会显示寻呼机。 问题答案: 此代码在aspx页面 在此,将在.cs页中使用的方法。该方法用于跟踪pa

  • 我正在做一个spring boot项目,使用OPENAPI作为api文档的工具。 我试图用直观的输入(page-pageSize-sort)覆盖UI中可分页json对象的显示 这是可行的,但是参数页面、页面大小和排序被添加到所有方法中。我如何才能使这只适用于需要可分页的方法?

  • 本文向大家介绍Django如何自定义分页,包括了Django如何自定义分页的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Django自定义分页的具体代码,供大家参考,具体内容如下 稳扎稳打版 book.html 封装保存版 封装保存版 封装版使用指南 封装版对应的HTML参考 效果图如下:  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 我想使用itext生成pdf。我会在某些时候添加内容以进行分页。我需要插入几个单独的conenidos依赖源,所以我要求用户在单独的页面上插入。有任何想法吗??? 问题答案: 调用告诉iText将后续对象放置在新页面上。仅当您放置下一个对象时,才会真正创建新页面。另外,仅在当前页面不为空白时创建一个新页面;否则,仅创建一个新页面。否则,它将被忽略;您可以用来克服这一点。 请参见下面的链