I have used pagination in my criteria builder query and alway get "last": true,
get URL
{{MaterialBaseURI}}/materials/pagination?confType={{confType}}&pageNumber=0&pageSize=5&title=link
My pagination code:
Optional<Pageable> optionalPageable = pageNumber.map(integer -> PageRequest.of(integer, pageSize.get(), Sort.by(Sort.Order.asc(TITLE))));
Page<MaterialMetadata> materialMetadata = materialRepository.findAll((Specification<MaterialMetadata>) (root, criteriaQuery, criteriaBuilder) -> {
Predicate predicate = criteriaBuilder.conjunction();
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get("conferenceType"), com.logmein.gotomaterialservice.entity.enums.ConferenceType.valueOf(String.valueOf(conferenceType))));
if (!StringUtils.isEmpty(title)) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder.like(root.get("title"), "%" + title + "%"));}
if (startDateTime != null && endDateTime != null && startDateTime != 0 && endDateTime != 0) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder.between(root.get("createdTime"), startDateTime, endDateTime));}
else if (startDateTime != null && startDateTime != 0) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder.greaterThanOrEqualTo(root.get("createdTime"), startDateTime));}
else if (endDateTime != null && endDateTime != 0) {
predicate = criteriaBuilder.and(predicate, criteriaBuilder.lessThanOrEqualTo(root.get("createdTime"), endDateTime));
}
return predicate;
}, optionalPageable.get());
output:
{
"content": [
...
],
"pageable": {
"sort": {
"empty": false,
"unsorted": false,
"sorted": true
},
"offset": 0,
"pageNumber": 0,
"pageSize": 5,
"paged": true,
"unpaged": false
},
"totalPages": 1,
"totalElements": 5,
"last": true,
"size": 5,
"number": 0,
"sort": {
"empty": false,
"unsorted": false,
"sorted": true
},
"numberOfElements": 5,
"first": true,
"empty": false
}
it has total 15 records, if we give page size =5 even though last= true, in ideal scenario it should be false
I do not know What I have missed here.