记录一次JPA分页查询优化方案
一、根据需求创建联合索引
alter table t_threeds_trans add index 索引名字 (create_date,acct_number,trans_status....);
二、List查询修改
select t.* from t_threeds_trans t where t.oid >= (
select oid from t_threeds_trans where
(:createDateStart is null or create_date >= :createDateStart)
and (:createDateEnd is null or create_date <= :createDateEnd)
and (:cardScheme is null or card_scheme >= :cardScheme)
and (:transStatus is null or trans_status >= :transStatus)
and ......
order by oid limit :pageSize,1
)limit 5
三、Count查询
select count(*) from t_threeds_trans where
and (:createDateStart is null or create_date >= :createDateStart)
and (:createDateEnd is null or create_date <= :createDateEnd)
and (:cardScheme is null or card_scheme >= :cardScheme)
and (:transStatus is null or trans_status >= :transStatus)
and ......
略...
四、Java修改分页方式
4.1 Dao层修改
@Query(value="参考上面List查询SQL",nativeQuery = true)
List<ThreedsTrans> findByCriteria2(@Param("createDateStart") String createDateStart,
@Param("createDateEnd") String createDateEnd
..........);
@Query(value="参考上面Count查询SQL",nativeQuery = true)
int findCountByCriteria2(@Param("createDateStart") String createDateStart,
@Param("createDateEnd") String createDateEnd
..........);
4.2 Service层修改
List<ThreedsTrans> findByCriteria2(@Param("createDateStart") String createDateStart,
@Param("createDateEnd") String createDateEnd
..........){
return dao.findByCriteria2(createDateStart,createDateEnd......);
}
int findCountByCriteria2(@Param("createDateStart") String createDateStart,
@Param("createDateEnd") String createDateEnd
..........){
return dao.findCountByCriteria2(createDateStart,createDateEnd......);
}
4.3 Controller层修改
List<ThreedsTrans> data = service.findByCriteria2(....);
int count = service.findCountByCriteria2(....);
Page<ThreedsTrans> transPage = new PageImpl<>(data,
new PageRequest(form.getPageNumber(),application.getPageSize()),
count);