使用Easy-UI 和SSH JPA 按条件查询分页
程序员文章站
2024-01-22 22:56:34
...
1.需求:有条件分页查询 前提 页面部分
*给查询按钮添加点击事件
*将查询表单中的数据转换成符合EasyUI格式js对象到datagrid的load方法加载到datagrid,携带数据到后台(下面有代码)
*datagrid要求格式:
*转换表单数据JS方法:(上边表单有调用此方法)
$.fn.serializeJson = function() {
var serializeObj = {};
var array = this.serializeArray();
var str = this.serialize();
$(array).each(function() {
if(serializeObj[this.name]) {
if($.isArray(serializeObj[this.name])) {
serializeObj[this.name].push(this.value);
} else {
serializeObj[this.name] = [serializeObj[this.name], this.value];
}
} else {
serializeObj[this.name] = this.value;
}
});
return serializeObj;
};
*datagrid的显示数据表格
*页面的资源代码:
*上述条件查询form表单数据已经绑定datagrid,传递到后台的页面代码:
*Action 后台接收:(注意:datagrid会自动提交携带分页的两个参数 :当前页page和总目录数rows, 因此次加载是动态加载 返回前端json数据 {“total”:28,”rows”:[
{“productid”:”FI-SW-01”,”productname”:”Koi”}
]})所以会需要total 和rows 参数
*Action代码:
@SuppressWarnings("all")
@Controller
@Scope("prototype")
@Namespace("/")
@ParentPackage("json-default")
public class CourierAction extends ActionSupport implements ModelDriven<Courier> {
private Courier courier = new Courier();
@Autowired
private CourierService courierService;
@Override
public Courier getModel() {
return courier;
}
private Integer page;
private Integer rows;
public void setPage(Integer page) {
this.page = page;
}
public void setRows(Integer rows) {
this.rows = rows;
}
@Action(value = "courier_queryPage", results = { @Result(name = "success", type = "json") })
public String queryPage() {
Pageable pageable = new PageRequest(page - 1, rows);
Specification<Courier> specification = new Specification<Courier>() {
@Override
/**
* 构造条件查询方法,如果发发返回null,代表无条件查询 root 参数获取条件表达式 name=? age=?
* criteriaQuery 参数 构造简单查询条件返回 提供where方法 criteriaBulider 参数
* 够造predicate对象 条件对象 够造复杂的查询效果
*/
public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
// 查询当前root跟对象courier
List<Predicate> list = new ArrayList<>();
// 表单查询(查询当前对象对应的数据表)
if (StringUtils.isNotBlank(courier.getCourierNum())) {
// 进行快递员 工号查询
Predicate p1 = cb.equal(root.get("courierNum").as(String.class), courier.getCourierNum());
list.add(p1);
}
// 进行公司模糊查询
if (StringUtils.isNotBlank(courier.getCompany())) {
Predicate p2 = cb.like(root.get("company").as(String.class), "%" + courier.getCompany() + "%");
list.add(p2);
}
// 进行快递员类型的的等值查询
if (StringUtils.isNotBlank(courier.getType())) {
Predicate p3 = cb.equal(root.get("type").as(String.class), courier.getType());
list.add(p3);
}
// 多表查询(查询当前对象 关联对象 对应数据表)
// 使用courier(root),关联standard
Join<Object, Object> standardRoot = root.join("standard", JoinType.INNER);
if (courier.getStandard() != null && StringUtils.isNotBlank(courier.getStandard().getName())) {
// 进行收派标准名称 模糊查询
// standard.name like %?%
Predicate p4 = cb.like(standardRoot.get("name").as(String.class),
"%" + courier.getStandard().getName() + "%");
list.add(p4);
}
return cb.and(list.toArray(new Predicate[0]));
}
};
Page<Courier> pagedata = courierService.findQueryPage(specification, pageable);
//也可以将这两个参数封装成一个bean类,更方便点
Map<String, Object> map = new HashMap<>();
map.put("total", pagedata.getTotalElements());
map.put("rows", pagedata.getContent());
ActionContext.getContext().getValueStack().push(map);
return SUCCESS;
}
*Service代码:
@Service
@Transactional
public class CourierServiceImpl implements CourierService {
@Autowired
private CourierDao courierDao;
@Override
public Page<Courier> findQueryPage(Specification<Courier> specification,Pageable pageable) {
// TODO Auto-generated method stub
return courierDao.findAll(specification,pageable);
}
*Dao层数据代码:
无需写代码jpa都给封装的好方法,在service调用即可
public interface CourierDao extends JpaRepository<Courier, Integer>,JpaSpecificationExecutor<Courier>{
}
*有需要的朋友可以看看,不喜勿喷