Как использовать пользовательский DTO в Spring JpaRepository для ответа на страницы

Я хочу написать запрос Spring Data 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);

Это работает, когда я заменяю возвращаемый тип со страницы на список, но мне нужен постраничный ответ.

Исключение

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

person Tharindu Eranga    schedule 19.11.2019    source источник
comment
Вам нужно написать countQuery для поддержки нумерации страниц. Например - @Query (значение = ваш запрос на выбор, countQuery = ваш запрос на подсчет)   -  person Vivek Swansi    schedule 11.03.2020


Ответы (1)


вы можете использовать CriteriaBuilder, чтобы вручную разбить на страницы и вернуть список вместо страницы

person Mehdi Jemhour    schedule 19.11.2019