javaspringspring-bootjpa

Modifying repository returned response by retaining the Page information in spring boot


I am using spring boot with JPA in my project. I have a service class which calls a repository method that returns Page<List<TestDTO>>

@Query("SOME QUERY")
Page<List<TestDTO>> findAllValues(@Param("itemNo") String itemNo, 
PageRequest pageRequest);

I want to modify some of the properties of the above Page response after the response is returned by the repository by retaining the Page information.

I have done in the following manner:

Page < List < TestDTO >> resultsPage = repository.findAllValues("itemOne", PageRequest.of(offset, pageSize, Sort.by(direction, field))

    resultsPage = resultsPage.map(this::transformTestDTOs);

    private List < TestDTO > transformTestDTOs(final List < TestDTO > testDTOList) {
      testDTOList.forEach(testDTO -> {
        testDTO.setItemName("New Name");
      });
      return testDTOList;

But I am getting the following exception:

.b.m.d.i.a.r.c.e.GlobalExceptionHandler[0;39m [2m:[0;39m Exception occured while processing the request java.lang.ClassCastException: class com.bosch.ma.dxt.in.apna.reports.response.dto.TTransCustomerStatementDTO cannot be cast to class java.util.List (com.bosch.ma.dxt.in.apna.reports.response.dto.TTransCustomerStatementDTO is in unnamed module of loader 'app'; java.util.List is in module java.base of loader 'bootstrap')
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.ArrayList$Itr.forEachRemaining(ArrayList.java:1003)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at org.springframework.data.domain.Chunk.getConvertedContent(Chunk.java:131)
    at org.springframework.data.domain.PageImpl.map(PageImpl.java:86)

My target is to modify the response List contents by retaining the Page information.

I have followed the following thread, but no use.

Modify Spring data Page<> class projection response in service layer


Solution

  • JPA does not support Page<List<TestDTO>> . The query should return Page<TestDTO> instead.

    1 ) Modify Repository method shown below

    @Query("SOME QUERY")
    Page<TestDTO> findAllValues(@Param("itemNo") String itemNo, PageRequest pageRequest);
    

    2 ) Modify Service Method

    Page<TestDTO> resultsPage = repository.findAllValues("itemOne", PageRequest.of(offset, pageSize, Sort.by(direction, field)));
    
    resultsPage = resultsPage.map(this::transformTestDTO);
    
    private TestDTO transformTestDTO(final TestDTO testDTO) {
        testDTO.setItemName("New Name");
        return testDTO;
    }