0

Payload

"country_code":["IT","FR","JP"],"ordina" : {"country_code":"DESC"}}"

If don't put ordina, is ok, but if I want sort my output receive an exception

Class CountryRepo

   //Remove @RepositoryRestResource below to disable auto REST api:
   public interface CountryRepo extends 
   PagingAndSortingRepository<Country,Id>,JpaSpecificationExecutor<Country>{
   } 

Class CountryService

@Service
   public class CountryService {
   @Autowired
   CountryRepo repository;

   public Map<String, Object> getAll(Pageable pageable) {
     return getAll(null, pageable);
   }

   /**
    * @param list
    * @param pageable
    * @return
    */
    public Map<String, Object> getAll(RequestObject request, Pageable pageable) {
    /* paginazione filtrata */
    Specs<Country> specs = null;
    if (request != null) {
      for (Field field : request.getClass().getDeclaredFields()) {
        field.setAccessible(true);
        if (field.getName() != "page" & field.getName() != "size" & field.getName()!="ordina") {
          try {
            if (!((List<Country>) field.get(request)).isEmpty()) {
              specs =
                new Specs<>(
                  new SearchCriteria(field.getName(), "in", field.get(request))
                );
            }
          } catch (IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
          }
        }
      }
    }
    //Page<Country> pages = null;
    Map<String, Object> service = buildService(specs, pageable);
    return service;
    }

    private Map<String, Object> buildService(
    Specs<Country> specs,
    Pageable pageable
    ) {
        Map<String, Object> service = new LinkedHashMap<>();
        Page<Country> pages = null;
        do {
            Map<String, Object> servicePage = new LinkedHashMap<>();
            pages = repository.findAll(specs, pageable);
            // aggiunta delle informazioni sulla paginazione
            servicePage.put("countries", pages.getContent());
            servicePage.put("currentPage", pages.getNumber() + 1);
            service.put(String.valueOf(pages.getNumber() + 1), servicePage);
            pageable = pages.nextPageable();
        } while (pages.hasNext());
            service.put("totalItems", pages.getTotalElements());
            service.put("totalForPage", pages.getSize());
            service.put("totalPages", pages.getTotalPages());
            return service;
        }
    }

Class CountryController

   Map<String, ?> countries = null;
   // DEFAULTVALUE.PAGE 1 and DEFAULTVALUE.SIZE=50
   Pageable pageable = PageRequest.of(
     request.getPage() - 1,
     request.getSize()
   );

   // Ordina more field (here not function)
   if (request.getOrdina() != null) {
     final Sort sort = Sort.by(Utility.sorting(request.getOrdina()));
     pageable = PageRequest.of(
       request.getPage() - 1,
       request.getSize(),
       sort
     );
   }

   // filter
   countries = service.getAll(request, pageable);

Class Utility

   public static List<Order> sorting(Map<String, String> myProperties) {
     List<Order> orders=new ArrayList<>();
     for (Entry<String, String> e:myProperties.entrySet()) {
        Direction direction=Direction.fromString(e.getValue());
        orders.add(new Order(direction, e.getKey()));
     }
     return orders;
   }

I would like to have as input a sort key that contains a map (field->type ("ASC","DESC"). Giving input this map the sorting function returns a list. Pageable use List to generate an ordered pageable.

final Sort sort = Sort.by(Utility.sorting(request.getOrdina())); pageable = PageRequest.of( request.getPage() - 1, request.getSize(), sort );

0 Answers0