序列化表单为json对象,datagrid带额外参提交一次…
2018-06-27 09:47:27来源:博客园 阅读 ()
查询窗口中可以设置很多查询条件
表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中
转换方法看代码注释
<td colspan="2"><a id="searchBtn" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-search'">查询</a> <script type="text/javascript"> $("#searchBtn").click(function(){ //1、将查询条件值获取到 var condition = $("#searchForm").serializeJson(); console.info(condition); //2、带参提交一次查询,从服务器加载新数据 包括两种数据1、分页需要page,rows 2、查询条件 $('#grid').datagrid('load', condition); //将查询窗口关闭 $("#searchWindow").window("close"); }) //(自定义的JQuery方法)将表单中所有有name的输入项使用serializeArray()方法序列化表单 //转变为 {"input的name":"input的value"} 的json对象形式,以替代一个个获取某个表单值 $.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; }; </script> </td>
JPA中带条件分页查询在下面的接口中
public interface JpaSpecificationExecutor<T> {
Page<T> findAll(Specification<T> spec, Pageable pageable);
所以
public interface CourierDao extends JpaRepository<Courier, Integer>, JpaSpecificationExecutor<Courier> {
CourierDao 要继承该接口
注意修改泛型T
Action类中使用Page<Courier> page = courierService.pageQuery(model, pageable);//带两个参的方法
model中是提交的查询条件,pageable中是page和rows两个参数
代码如下:
@Action("courierAction_pageQuery") public String pageQuery() throws Exception { Pageable pageable = new PageRequest(page, rows); Page<Courier> page = courierService.pageQuery(model, pageable); this.java2Json(page, null); /*Map<String, Object> map = new HashMap<>(); map.put("total", page.getTotalElements()); map.put("rows", page.getContent()); //将快递员对象中集合属性fixedAreas排除掉(忽略该属性,最终在快递员对象不存在属性) JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[]{"fixedAreas", "company"}); String json = JSONObject.fromObject(map, jsonConfig).toString(); System.err.println(json); ServletActionContext.getResponse().setContentType("text/json;charset=utf-8"); ServletActionContext.getResponse().getWriter().write(json);*/ return NONE; }
但带条件分页查询的方法需要的第一个参数类型为Specification<T> spec 如下
Page<T> findAll(Specification<T> spec, Pageable pageable);
所以代码
courierService.pageQuery(model, pageable)
在service实现类中要根据model生成Specification的对象才能调用接口中方法
return courierDao.findAll(spec , pageable);
生成对象方法如下:
public Page<Courier> pageQuery(final Courier model, Pageable pageable) { //封装查询对象Specification Specification<Courier> spec = new Specification<Courier>() { //封装查询条件: sql: select * from t_courier where 列1 = ? and|or 列2 like ? //参数一:根实体,代表Criteria查询的根对象,Criteria查询的查询根定义了实体类型,能为将来导航获得想要的结果,它与SQL查询中的FROM子句类似 //参数二:代表一个specific的顶层查询对象,它包含着查询的各个部分,比如:select 、from、where、group by、order by等 //参数三:用来构建CritiaQuery的构建器对象--产生Predicate(断言)实例工厂 public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate> list = new ArrayList<>(); //参数一:从根实体通过导航方式获取属性(表中列) //参数二:查询值 String courierNum = model.getCourierNum(); String company = model.getCompany(); String type = model.getType(); if(StringUtils.isNotBlank(courierNum)){ //。。。。 where c_courier_num = ? Predicate p1 = cb.equal(root.get("courierNum").as(String.class), courierNum); list.add(p1); } if(StringUtils.isNotBlank(company)){ // +条件 c_company = ? Predicate p2 = cb.equal(root.get("company").as(String.class), company); list.add(p2); } if(StringUtils.isNotBlank(type)){ // +条件 c_type = ? Predicate p3 = cb.equal(root.get("type").as(String.class), type); list.add(p3); } //关联查询 Standard standard = model.getStandard(); if(standard!=null){ String standardName = standard.getName(); if(StringUtils.isNotBlank(standardName)){ //创建关联对象 :Standard 默认:JoinType.INNER内连接 Join<Object, Object> join = root.join("standard", JoinType.INNER); //查询关联对象中属性 Predicate p4 = cb.like(join.get("name").as(String.class), "%"+standardName+"%"); list.add(p4); } } if(list.size()==0){ return null; } Predicate [] predicates = new Predicate[list.size()]; //将list结合中断言对象存在 数组中predicates predicates = list.toArray(predicates); // cb.and 相当于查询条件 使用 and 拼接--并且 // cb.or 相当于查询条件 使用 or 拼接 --或者 return cb.or(predicates); } }; return courierDao.findAll(spec , pageable); }
StringUtils为org.apache.commons.lang3.StringUtils包下工具类
其中断言的值有好几个
拼接的时候需要提供一个断言的数组
return cb.or(predicates );
而数组是定长的,我们又不确定有几个断言
所以只能创建一个可变长度的数组,那么就需要设置数组长度使用一个变量,使用list.size()
Predicate [] predicates = new Predicate[list.size()];
将集合变为指定类型的数组使用其toArray()方法,无惨转为Object[],有参转为指定类型的数组
predicates = list.toArray(predicates);
如果没有额外条件,就是一个正常的分页查询
if(list.size()==0){
return null;
}
这时
return courierDao.findAll(spec , pageable);
spec为空
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:OAuth 2.0 授权码请求
下一篇:仿9GAG制作过程(五)
- SpringBoot 2.x 版本以put方式提交表单不生效的问题详解 2020-06-01
- Dubbo 2.7.7 发布,FastJson 升级了! 2020-05-25
- MapperReduce序列化自定义分区作业 2020-05-20
- 关于序列化的 10 几个问题,你顶得住不?.md 2020-05-19
- LeetCode 面试题37. 序列化二叉树 2020-05-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash