SprigDataJpaの強力な手動改ページクエリ(パッケージとテクニック)
16812 ワード
背景
JPAは簡単な種類の照会はいいですが、ビジネスシーンはそんなに簡単ではないので、sql文を使っていくつかのクエリを構成しなければなりません.この時は手動でページを分けたほうがいいです.MyBatisのような使い方です.
エンティティクラス
これは従業員の実体です.彼にメスを入れます.
手書きの語句は、すべてカスタマイズして機能が強く、どんな強力なsqlが使えるかを考えられるというメリットがあります.
(c.emp num=?1 or?1 is null)これは非空判定です.空ならこの条件をスキップして実行しません.
Limitができないなら、ここで補充してください.Limitはmysqlの文法select*from table limit mで、nの中のmは記録開始のindexを指します.0から、第一条は第m+1条から、n条を取ることを意味します.
Apple ReturnUtil&Apple Return Object
これらはみんなの必要に応じてパッケージ化されています.ここでは例を示します.
ここで完成しました.どうですか?使いやすいですか?カスタマイズ性が強いです.ここにはいくつかのヒントがあります.例えば、表を多く関連させたいなら、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
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)
}
締め括りをつけるここで完成しました.どうですか?使いやすいですか?カスタマイズ性が強いです.ここにはいくつかのヒントがあります.