SprigDataJpaの強力な手動改ページクエリ(パッケージとテクニック)


背景
JPAは簡単な種類の照会はいいですが、ビジネスシーンはそんなに簡単ではないので、sql文を使っていくつかのクエリを構成しなければなりません.この時は手動でページを分けたほうがいいです.MyBatisのような使い方です.
エンティティクラス
これは従業員の実体です.彼にメスを入れます.
@Entity
@NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e")
public class Employee implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	private int id;
	private Timestamp createtime;
	private String empImage;
	private String empName;
	private String empNum;
	private Timestamp lastupdatetime;
	private String status;
	......
}
Repository類
手書きの語句は、すべてカスタマイズして機能が強く、どんな強力なsqlが使えるかを考えられるというメリットがあります.
(c.emp num=?1 or?1 is null)これは非空判定です.空ならこの条件をスキップして実行しません.
@Repository
public interface EmployeeRepositrory extends JpaRepository<Employee, Integer> {
	@Query(value ="select * from employee c "
			+ "where (c.emp_num=?1 or ?1 is null) and (c.status=?2 or ?2 is null) "
			+ "order by c.lastupdatetime desc  limit ?3,?4 ",nativeQuery = true)
	List<Employee> findAllList(String empNum,String status,Integer pageNumber,Integer pageSize);
	
	@Query(value ="select count(*) from employee c "
			+ "where (c.emp_num=?1 or ?1 is null) and (c.status=?2 or ?2 is null) "
			+ "order by c.lastupdatetime desc ",nativeQuery = true)
	Integer countAllList(String empNum,String status);
}

コントローラ
	@PostMapping("/list")
	public ApiReturnObject findAll(String empNum,String status, Integer pageNumber, Integer pageSize) {
			//  pageNumber, pageSize  
			CheckUtils.checkPageNumberPageSize(pageNumber, pageSize);
			//    
			List<Employee> list=employeeRepositrory.findAllList(empNum, status,(pageNumber-1)*pageSize, pageSize);
			//    
		    Integer countNum=employeeRepositrory.countAllList(empNum, status);
		    //    
			return ApiReturnUtil.pageManual(pageNumber, pageSize, countNum, list);		
	}
(pagenumber-1)*pageSize、pageSizeこれは、mysqlのlimit x,yのためです.xは、いくつかのデータから始まり、yはどれぐらいの取得を表していますか?だから、数学的には、ここでは(PageNumber-1)*PageSizeは、いくつかのデータから始まります.例えば、全部で12つの記録があります.pageNumber=2、pageSize=10(pageNumber-1)*PageSize、PageSize=10、10は第10条から10条を連続して持つことを表しています.
Limitができないなら、ここで補充してください.Limitはmysqlの文法select*from table limit mで、nの中のmは記録開始のindexを指します.0から、第一条は第m+1条から、n条を取ることを意味します.
Apple ReturnUtil&Apple Return Object
これらはみんなの必要に応じてパッケージ化されています.ここでは例を示します.
public class ApiReturnObject implements Serializable{
	String errorCode="00";
	Object errorMessage;
	Object returnObject;
	String pageNumber;
	String pageSize;
	String totalElements;
	String totalPages;
	public ApiReturnObject(String pageNumber,String pageSize,String totalElements,String totalPages,String errorCode, Object errorMessage, Object returnObject) {
		super();
		this.pageNumber = pageNumber;
		this.errorCode = errorCode;
		this.errorMessage = errorMessage;
		this.returnObject = returnObject;
		this.pageSize = pageSize;
		this.totalElements = totalElements;
		this.totalPages = totalPages;
	}
}
	public static ApiReturnObject pageManual(Integer pageNumber, Integer pageSize,Integer countNum, List returnObject) {
		return new ApiReturnObject(pageNumber+"",pageSize+"",countNum+"",getTotalPages(countNum, pageSize),"00","success",returnObject);
	}
	
	public static String getTotalPages(Integer countNum, Integer pageSize) {
		if((countNum%pageSize)==0) {
			return ((countNum/pageSize))+"";
		}else {
			return ((countNum/pageSize)+1)+"";
		}
	}
戻りフォーマットは以下の通りです
{
    "errorCode": "00", //   ,  00    
    "errorMessage": "success", //    
    "pageNumber": "1", //    
    "pageSize": "10", //    
    "returnObject": [{......}], //   list,     
    "totalElements": "12",//count            
    "totalPages": "2" //      ,    /     +1    ((countNum/pageSize)+1)
}
締め括りをつける
ここで完成しました.どうですか?使いやすいですか?カスタマイズ性が強いです.ここにはいくつかのヒントがあります.
  • 例えば、表を多く関連させたいなら、sql文の中のleft jinを心ゆくまでやりましょう.
  • フィールドがマスタテーブルにない場合、追加したい場合は@Transient注釈を付けて、このフィールドを実体化しないことを表しますが、クエリはまた関連付けられます.
  • (c.emp num=?1 or?1 is null)という形で多くの回り道をすることができます.(特別な需要がない限り)
  • あいまいなクエリは、SprigDataJPAの@Query with LIKE(JPAあいまいなクエリ)を参照することができます.https://zhengkai.blog.csdn.net/article/details/80681502