1.说明

在代码开发时,我们最常使用的是做分页处理,本文介绍一下如何进行分页处理。

2.分页代码

public JsonPageResult query(@RequestBody QueryData queryData) throws Exception{
        JsonPageResult jsonResult=JsonPageResult.getSuccess("返回数据成功!");
        try{
            QueryFilter filter=QueryFilterBuilder.createQueryFilter(queryData);
            handleFilter(filter);
            IPage page= getBaseService().query(filter);
            handlePage(page);
            jsonResult.setPageData(page);
        }catch (Exception ex){
            jsonResult.setSuccess(false);
            logger.error(ExceptionUtil.getExceptionMessage(ex));
            jsonResult.setMessage(ExceptionUtil.getExceptionMessage(ex));
        }
        return jsonResult;
    }

上面的代码是进行分页的代码。

3. dao query代码

default  IPage query(QueryFilter queryFilter){
        BaseDao baseDao=getRepository();

        Map<String,Object> params= PageHelper.constructParams(queryFilter);

        return  baseDao.query(queryFilter.getPage(),params);
    }

4. mapping 需要编写 query ID

<select id="query" resultType="com.redxun.bpm.core.entity.BpmInstCc" parameterType="java.util.Map">
        select * from BPM_INST_CC
        <where>
            <if test="@rx.Ognl@isNotEmpty(w.whereSql)">
                ${w.whereSql}
            </if>
        </where>
        <if test="@rx.Ognl@isNotEmpty(w.orderBySql)">
            ORDER BY ${w.orderBySql}
        </if>
        <if test="@rx.Ognl@isEmpty(w.orderBySql)">
            ORDER BY  ID_ DESC
        </if>
    </select>

在平台中如果需要使用分页,那么可以使用生成代码的 query 方法。

5. 构建SQL

我们通过代码:

Map<String,Object> params= PageHelper.constructParams(queryFilter);

将queryFilter 自动构建whereSql,orderBySql。

这里我们知道我们会自动构建SQL,那么平台是根据什么来构建SQL 的呢。

我们可以看到前端的条件。

<a-col :span="8">
                    <a-form-item label="创建时间 从">
                      <a-date-picker
                        placeholder="请输入创建时间"
                        v-model="queryParam.Q_CREATE_TIME__D_LT"
                        format="YYYY-MM-DD"
                        style="width: 100%;"
                      />
                    </a-form-item>
                  </a-col>
                  <a-col :span="8">
                    <a-form-item label="至">
                      <a-date-picker
                        placeholder="请输入创建时间"
                        v-model="queryParam.Q_CREATE_TIME__D_LT"
                        format="YYYY-MM-DD"
                        style="width: 100%;"
                      />
                    </a-form-item>
                  </a-col>

我们可以看到 参数 使用 了 Q_CREATE_TIME__D_LT 格式。

Q_参数数据类型操作符

在平台中只有这种格式定义的参数,平台才会自动构建出一个whereSql

5.1 数据类型

数据类型 说明
S 字符串
L 长整型
I 整形
DB DOUBLE
BD BIGDECIMAL
F FLOAT
SN SHORT
D 日期类型

5.2 操作符

操作符 说明
EQ 全等 =
NEQ 不等 !=
GT 大于
GE 大于等于
LT 小于
LE 小于等于
LK 全模糊 %数据%
LEK 左模糊 %数据
RIK 右模糊
ISNULL 数据为空
NOTNULL 数据不为空
IN in 操作

5.3 如何排序

5.3.1 rx-grid 排序

在查询时如果需要排序,我们可以修改 rx-grid 控件的column对象。

{title: '标识键', dataIndex: 'key', width: 130,sorter:true,sortField:"KEY_"}

比如我需要增加 sorter 和 sortField 两个属性。

其中 sortField 是 需要排序的字段名称

当点击表格排序时:

我们可以看到传递的参数:

{"pageNo":1,"pageSize":10,"sortField":"KEY_","sortOrder":"desc","params":{"Q_IS_DIALOG__S_EQ":"NO"}}

5.3.2 后端代码排序

protected void handleFilter(QueryFilter filter) {
        filter.addSortParam(new SortParam("KEY_","DESC"));
        super.handleFilter(filter);
    }

5.4 注意的问题

5.4.1 有表前缀的情况

有些情况下,比如我们需要写如下的SQL

SELECT A.ID,B.NAME FROM A,B WHERE A.ID=B.RESID AND B.USERID='1'

这个需要指定表名,那么这是我们在前端需要此构建参数。

queryParam.Q_B.USERID_D_LT

这样构建参数在前端其实是不合法的。

需要使用如下的方式:

queryParam['Q_B.USERID_D_LT']

使用这种方式,即可生成正确的SQL语句。

5.4.2 不参与构建whereSql的方式

有些情况下,用户希望自己编写SQL,而不是使用自动构建SQL的方式。

这种方式下用户可以这样使用 QueryFilter

QueryFilter filter= QueryFilterBuilder.createQueryFilter(queryData);

IUser user= ContextUtil.getCurrentUser();
filter.addParam("userId",user.getUserId());

这样在编写Mapping文件时,我们可以如下的方式编写。

  select ID_,SUBJECT_,NODE_ID_,NODE_NAME_,FROM_USER_,FROM_USER_ID_,INST_ID_,DEF_ID_,CC_TYPE_,
        TENANT_ID_,CREATE_DEP_ID_,CREATE_BY_,CREATE_TIME_,UPDATE_BY_,UPDATE_TIME_
        from BPM_INST_CC WHERE FROM_USER_ID_=#{w.userId}

5.4.3 编写自定分页代码

在默认的情况下,我们默认有query 方法进行分页处理,但是query 方法不能解决所有的问题。这就要求我们自己编写一些特殊的分页方法。

编写代码如下:

public   IPage getMyTurnTo(QueryFilter queryFilter){
        Map<String,Object> params= PageHelper.constructParams(queryFilter);
        return  bpmInstCcMapper.getMyTurnTo(queryFilter.getPage(),params);
    }
IPage getMyTurnTo(IPage page, @Param("w") Map<String, Object> params);
<select id="getMyTurnTo" resultType="com.redxun.bpm.core.entity.BpmInstCc" parameterType="java.util.Map">
        select ID_,SUBJECT_,NODE_ID_,NODE_NAME_,FROM_USER_,FROM_USER_ID_,UPDATE_BY_,UPDATE_TIME_
        from BPM_INST_CC WHERE FROM_USER_ID_=#{w.userId}

        <if test="@rx.Ognl@isNotEmpty(w.whereSql)">
           and ${w.whereSql}
        </if>

        <if test="@rx.Ognl@isNotEmpty(w.orderBySql)">
            ORDER BY ${w.orderBySql}
        </if>
        <if test="@rx.Ognl@isEmpty(w.orderBySql)">
            ORDER BY  CREATE_TIME_ DESC
        </if>
    </select>
文档更新时间: 2022-01-20 14:53   作者:zyg