序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询

查询窗口中可以设置很多查询条件

表单中输入的内容转为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为空

原文地址:https://www.cnblogs.com/qingyundian/p/9234556.html

时间: 2024-10-11 22:31:00

序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询的相关文章

jQuery序列化表单为JSON对象

<form id="myform"> <table> <tr> <td>姓名:</td> <td> <input type="text" name="name" /> </td> </tr> <tr> <td>性别:</td> <td> <input type="radio&q

form表单转化json对象

利用 $.fn 可以让每一个jquery 对象都能直接使用这个方法. //form表单转化json对象$.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function () { if (o[this.name]) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].pus

序列化表单为Json字符串

$.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function () { if (o[this.name] !== undefined) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].push(this.value || ''); } else { o[this.

jQuery序列化表单 serialize() serializeArray()

1.serialize()方法 描述:序列化表单内容为字符串,用于Ajax请求. 格式:var data = $("form").serialize(); 2.serializeArray()方法 描述:序列化表单元素(类似'.serialize()'方法)返回JSON数据结构数据. 注意,此方法返回的是JSON对象而非JSON字符串.需要使用插件或者<a>第三方库</a>进行字符串化操作. 格式:var jsonData = $("form"

jQuery序列化表单数据 serialize()、serializeArray()及使用

1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用一一列举出每一个参数.只需将data参数设置为 $("form").serialize() 即可. 2.serializeArray()方法 格式:var jsonData = $("form").serializeArray(); 功能:将页面表单序列化成一个JSON

jQuery 序列化表单数据

[转自]jQuery 序列化表单数据 serialize() serializeArray() 1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用一一列举出每一个参数.只需将data参数设置为 $("form").serialize() 即可. 2.serializeArray()方法 格式:var jsonData = $("

jQuery 序列化表单数据 serialize() serializeArray()

1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用一一列举出每一个参数.只需将data参数设置为 $("form").serialize() 即可. 2.serializeArray()方法 格式:var jsonData = $("form").serializeArray(); 功能:将页面表单序列化成一个JSON

jquery序列化表单以及回调函数的使用

在开发项目中,将前台的值传给后台,有时的JSP表单中的值有一两个,也有全部的值,如果这时一个个传,必定不是很好的办法,所以使用jQuery提供的表单序列化方法,可以很好的解决这个问题,同时可以封装成通用的函数,执行成功可以调用各自的回调函数,实现各自的功能. 代码如下: function queryUserInfo(actionUrl,formId,fun){ var params=new Object(); //声明数组 $.each($("#"+formId).serializeA

SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换

SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换 场景一:表单中的日期字符串和JavaBean的Date类型的转换 在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换, 例如,如下代码S_ROLE_QO这个bean中包含有Date类型属性,不处理就拿不到值. /** * 分页取角色列表 * @param s_ROLE_QO 角色查询条件 * @return */ @RequestMapping(value = "/