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

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

表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中

转换方法看代码注释

查询

JPA中带条件分页查询在下面的接口中

public interface JpaSpecificationExecutor

Page

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

所以

public interface CourierDao extends JpaRepository

CourierDao 要继承该接口

注意修改泛型T

Action类中使用Page

model中是提交的查询条件,pageable中是page和rows两个参数

代码如下:

@Action("courierAction_pageQuery")
    public String pageQuery() throws Exception {
        Pageable pageable = new PageRequest(page, rows);
        Page page = courierService.pageQuery(model, pageable);
        this.java2Json(page, null);
        /*Map 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

Page

所以代码

courierService.pageQuery(model, pageable)

在service实现类中要根据model生成Specification的对象才能调用接口中方法

return courierDao.findAll(spec , pageable);

生成对象方法如下:

public Page pageQuery(final Courier model, Pageable pageable) {
    //封装查询对象Specification
    Specification spec = new Specification() {

        //封装查询条件: 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 root, CriteriaQuery query, CriteriaBuilder cb) {

            List 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 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为….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为空

如果查询条件在实体的关联对象中,则需要多表关联查询

不能直接使用root,直接使用root.get(“name”)得到的是当前实体(courier)中的name,我们要的是关联实体(standard)的name属性

所以要得到关联对象join,通过standard对象(属于Courier实体的属性即可)关联,默认是内连接,也可以左外右外连接

Join

通过关联对象进行查询即可

Predicate p4 = cb.like(join.get(“name”).as(String.class), “%”+standardName+”%”);

datagrid这个ajax请求的好处就在于发送的请求不会刷新浏览器,所以查询的条件会一直在,不会影响到分页

Original: https://www.cnblogs.com/qingyundian/p/9234556.html
Author: Advancing-Swift
Title: 序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542136/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • springcloud

    转载于狂神老师 ,本文仅作为笔记使用 回顾之前的知识~●JavaSE ●数据库●前端●Servlet ●Http ●Mybatis ●Spring ●SpringMVC ●Spri…

    Java 2023年6月9日
    065
  • HashMap源码,看我这篇就够了

    HashMap源码深度剖析 * HashMap底层数据结构(为什么引入红黑树、存储数据的过程、哈希碰撞相关问题) * HashMap成员变量(初始化容量是多少、负载因子、数组长度为…

    Java 2023年6月15日
    055
  • 如何使用(扫描)二维码进行登录

    一、项目背景 &#x8FD9;&#x662F;&#x6211;&#x52A0;&#x5165;&#x535A;&#x5BA2…

    Java 2023年6月14日
    078
  • Vue Element-ui表单校验规则,你掌握了哪些?

    1、前言 Element-ui表单校验规则,使得错误提示可以直接在form-item下面显示,无需弹出框,因此还是很好用的。 我在做了登录页面的表单校验后,一度以为我已经很了解表单…

    Java 2023年6月14日
    078
  • Quorum 机制

    分布式系统的设计中会涉及到许多的协议、机制用来解决可靠性问题、数据一致性问题等,Quorum 机制就是其中的一种。我们通过分布式系统中的读写模型来简单介绍它。 分布式系统中的读写模…

    Java 2023年6月15日
    071
  • Java中修饰符的分类及用法

    是静态修饰符,静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间。 Original: https://www.cnblogs.com/mojospy/p/…

    Java 2023年6月9日
    076
  • 7-枚举和注解

    枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类 当需要定义一组常量时,强烈建议使用枚举类 如果枚举类中只一个对象,则可以作为单例模式的实现方式。 1.如何自定义枚举类…

    Java 2023年6月7日
    070
  • SpringBoot全局定时任务

    @EnableScheduling public class Controller extends nameController {//定义时间间隔@Scheduled(fixed…

    Java 2023年6月14日
    074
  • Spring 5

    Spring 5框架 一、Spring概念 1、Spring是轻量级的JavaEE框架 2、Spring可以解决企业应用开发的复杂性 3、Spring有两个核心部分:IOC和AOP…

    Java 2023年6月15日
    075
  • 老徐和阿珍的故事:CAP是什么?超级爱放P吗?

    人物背景:老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。阿珍,女…

    Java 2023年6月7日
    085
  • 红黑树添加删除

    上一篇写了234树对比红黑树,和红黑树某些情况需要调整的原因,这篇就只写红黑树的添加和删除 红黑树 JAVA技术交流群:737698533 性质 每个节点要么红色要么黑色 根节点是…

    Java 2023年6月6日
    080
  • 使用Flutter开发的抖音国际版

    简介 最近花了两天时间研究使用Flutter开发一个抖音国际版. 个人感觉使用Flutter开发app快得不要不要的额. 两天就基本可以开发个大概出来. 最主要是热重载,太方便实时…

    Java 2023年6月7日
    089
  • 使用 sed 处理文本文件

    sed 是一款 GNU 流编辑器,可以按照指定的规则去处理文本文件或流,其强大的功能使用户在命令中快捷地修改文本文件成为可能。 它不会修改文件,除非使用shell重定向来保存结果。…

    Java 2023年6月7日
    0111
  • Spring官网下载dist.zip的几种方法

    Spring官网改版后,很多项目的完整zip包下载链接已经隐掉了,虽然Spring旨在引导大家用更”高大上”的maven方式来管理所依赖的jar包,但是完全…

    Java 2023年5月30日
    075
  • C++基础-程序4区

    内存分区模型 C++中程序在执行时,将程序大方向分为4个区域 代码区:存放函数体的二进制代码,由系统操作进行管理 全局区:存放全局变量,静态变量和常量 栈区:由编译器自动分配和释放…

    Java 2023年6月5日
    076
  • 【Q&A】Fixing NuGet.targets(131,5) error The local source doesn’t exist

    当出现类似的nuget错误的时候 The local source ‘C:\Program Files (x86)\Microsoft Visual Studio\Shared\N…

    Java 2023年6月8日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球