Sorting and Pagination
We can define our Repository Interface using 'PagingAndSortingRepository' also. It is sub type of CrudRepository.
PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {}
=> Addtional methods:
a. findAll(Sort sort):List
b. findAll(Pageable pageable):Page
SQL Code
order by sname asc => Sort.by("sname") //default is ASC
Sort.by(Direction.ASC,"sname)
order by sname desc => Sort.by(Direction.DESC,"sname")
=> Sort class is having static method name by that returns same object
class Sort {
static Sort by(String property) { ___ }
static Sort by(Direction direction, String property) { ___ }
static class Order {
static Order asc(String property) { }
static Order desc(String property) { }
}
static Sort by(Order ords..) { ___ }
public static enum Direction {
ASC, DESC;
//...
}
}
call:
Sort s = Sort.by("sname");
Sort s = Sort.by("sname","sfee"); //both comes in ASC
Sort s = Sort.by(Direction.DESC,"sname");
Sort s = Sort.by(Direction.DESC,"sname","sfee); //both comes in desc
Sort s = Sort.by(Order.asc("sname"),Order.desc("sfee"));
1. Model
package in.nareshit.raghu.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@Data
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="stdtab")
public class Student {
@Id
@Column(name="sid")
@NonNull
private Integer stdId;
@Column(name="sname")
private String stdName;
@Column(name="sfee")
private Double stdFee;
}
2. Repository
package in.nareshit.raghu.repo;
import org.springframework.data.repository.PagingAndSortingRepository;
import in.nareshit.raghu.model.Student;
public interface StudentRepository
extends PagingAndSortingRepository<Student, Integer>
{
}
3. Runner class
package in.nareshit.raghu.runner;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;
import org.springframework.stereotype.Component;
import in.nareshit.raghu.model.Student;
import in.nareshit.raghu.repo.StudentRepository;
@Component
public class TestStudentOprPageAndSort implements CommandLineRunner {
@Autowired
private StudentRepository repo;
public void run(String... args) throws Exception {
repo.save(new Student(101, "SYED MD", 580.0));
repo.save(new Student(102, "AMRIT", 480.0));
repo.save(new Student(103, "ANIL", 600.0));
repo.save(new Student(104, "SAM", 320.0)); //INSERT
repo.saveAll(
List.of(
new Student(105, "ABC", 800.0),
new Student(106, "XYZ", 900.0),
new Student(107, "MNO", 500.0)
)
);
repo.findAll().forEach(System.out::println);
System.out.println("###########################");
Sort s1 = Sort.by("stdName");// ASC
Sort s1 = Sort.by(Direction.ASC,"stdName");// ASC
Sort s1 = Sort.by(Direction.DESC,"stdName","stdFee");// ASC
Sort s1 = Sort.by(Order.asc("stdName"),Order.desc("stdFee"));// ASC
repo.findAll(s1).forEach(System.out::println);
}
}
Sorting using Pageble Interface
findAll(Pageable):Page This method is used to get data page by page.
Here Pageable is a Interface. Impl class is PageRequest having method of(number,size) return Pageable.
Pageable p = PageRequest.of(0,10); //number, size
1. Model
package in.nareshit.raghu.model;
import javax.persistence.Column;
//ctrl+shift+O
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@Data
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="stdtab")
public class Student {
@Id
@Column(name="sid")
@NonNull
private Integer stdId;
@Column(name="sname")
private String stdName;
@Column(name="sfee")
private Double stdFee;
}
2. Repository
package in.nareshit.raghu.repo;
import org.springframework.data.repository.PagingAndSortingRepository;
import in.nareshit.raghu.model.Student;
public interface StudentRepository
extends PagingAndSortingRepository<Student, Integer>
{
}
3. Runner class
package in.nareshit.raghu.runner;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;
import in.nareshit.raghu.model.Student;
import in.nareshit.raghu.repo.StudentRepository;
@Component
public class TestStudentOprPageAndSortTwo implements CommandLineRunner {
@Autowired
private StudentRepository repo;
public void run(String... args) throws Exception {
repo.save(new Student(101, "SYED", 580.0));
repo.save(new Student(102, "AMRIT", 480.0));
repo.save(new Student(103, "ANIL", 600.0));
repo.save(new Student(104, "SAM", 320.0));
repo.save(new Student(105, "ABC", 800.0));
repo.save(new Student(106, "XYZ", 900.0));
repo.save(new Student(107, "MNO", 500.0));
repo.save(new Student(108, "XYZ", 500.0));
repo.save(new Student(109, "MTY", 600.0));
repo.save(new Student(110, "IUJ", 700.0));
repo.save(new Student(111, "NJI", 800.0));
//Input (pageable) = number, size
Pageable pageable = PageRequest.of(333, 5);
//execute query
Page page = repo.findAll(pageable);
//print output
List data = page.getContent();
data.forEach(System.out::println);
//meta data
System.out.println(" Is Empty Page? " + page.isEmpty());
System.out.println(" Is First Page? " + page.isFirst());
System.out.println(" Is Last Page? " +page.isLast());
System.out.println(" Next Page? " +page.hasNext());
System.out.println(" Previous Page? " +page.hasPrevious());
System.out.println(" Total Pages? " +page.getTotalPages());
System.out.println(" Current Page Number? " +page.getNumber());
System.out.println(" Page Size? " + page.getSize());
}
}
Pagination:-
---Internal Formuals: (Hibernate Ex)---
Inputs:
pageNumber = pn
pageSize = ps
totalRows = tr
start Row = sr = (pn-1)*ps
end row = current row to ps limit
-Ex-----------
UI Index (pn=1 internally page=0) , ps =3
start row = (pn-1)*ps = (1-1)*3 = 0*3 = 0
end row = 0th row to 3 rows = 3
---------------------------------------------------------
toatalPages = tr/ps + ( tr%ps > 0? 1:0)
= 9/3 + (9%3>0? 0:1 )
= 3 + 0 > 0 ? 1:0 = 3+0 = 3
UI pn=2, ps=3
Startr row = (pn-1 ) * ps = 1 * 3 = 3
105 rows , pagesize=50
1st page - 0-49
2nd page - 50-99
3rd page - 100-104
-------------------------------------------------------------
While Implementing Pagination we can also send Sorting details
by default pagination output comes without Sorting (unsorted)
Inside PageRequest class use method (3 param)
of(int page, int size, Sort sort)
//Pageable pageable = PageRequest.of(1, 5,Sort.by("stdName","stdId"));
//Pageable pageable = PageRequest.of(1, 5,Sort.by(Order.asc("stdName"),Order.desc("stdId")));
Pageable pageable = PageRequest.of(2, 5,Sort.by(Direction.DESC,"stdName","stdId"));
No Comments Yet!!