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 );