说明

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

分页代码

  1. public JsonPageResult query(@RequestBody QueryData queryData) throws Exception{
  2. JsonPageResult jsonResult=JsonPageResult.getSuccess("返回数据成功!");
  3. try{
  4. QueryFilter filter=QueryFilterBuilder.createQueryFilter(queryData);
  5. handleFilter(filter);
  6. IPage page= getBaseService().query(filter);
  7. handlePage(page);
  8. jsonResult.setPageData(page);
  9. }catch (Exception ex){
  10. jsonResult.setSuccess(false);
  11. logger.error(ExceptionUtil.getExceptionMessage(ex));
  12. jsonResult.setMessage(ExceptionUtil.getExceptionMessage(ex));
  13. }
  14. return jsonResult;
  15. }

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

dao query代码

  1. default IPage query(QueryFilter queryFilter){
  2. BaseDao baseDao=getRepository();
  3. Map<String,Object> params= PageHelper.constructParams(queryFilter);
  4. return baseDao.query(queryFilter.getPage(),params);
  5. }

mapping 需要编写 query ID

  1. <select id="query" resultType="com.redxun.bpm.core.entity.BpmInstCc" parameterType="java.util.Map">
  2. select * from BPM_INST_CC
  3. <where>
  4. <if test="@rx.Ognl@isNotEmpty(w.whereSql)">
  5. ${w.whereSql}
  6. </if>
  7. </where>
  8. <if test="@rx.Ognl@isNotEmpty(w.orderBySql)">
  9. ORDER BY ${w.orderBySql}
  10. </if>
  11. <if test="@rx.Ognl@isEmpty(w.orderBySql)">
  12. ORDER BY ID_ DESC
  13. </if>
  14. </select>

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

构建SQL

我们通过代码:

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

将queryFilter 自动构建whereSql,orderBySql。

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

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

  1. <a-col :span="8">
  2. <a-form-item label="创建时间 从">
  3. <a-date-picker
  4. placeholder="请输入创建时间"
  5. v-model="queryParam.Q_CREATE_TIME__D_LT"
  6. format="YYYY-MM-DD"
  7. style="width: 100%;"
  8. />
  9. </a-form-item>
  10. </a-col>
  11. <a-col :span="8">
  12. <a-form-item label="至">
  13. <a-date-picker
  14. placeholder="请输入创建时间"
  15. v-model="queryParam.Q_CREATE_TIME__D_LT"
  16. format="YYYY-MM-DD"
  17. style="width: 100%;"
  18. />
  19. </a-form-item>
  20. </a-col>

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

Q参数数据类型_操作符

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

数据类型

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

操作符

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

注意的问题

有表前缀的情况

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

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

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

  1. queryParam.Q_B.USERID_D_LT

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

需要使用如下的方式:

  1. queryParam['Q_B.USERID_D_LT']

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

不参与构建whereSql的方式

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

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

  1. QueryFilter filter= QueryFilterBuilder.createQueryFilter(queryData);
  2. IUser user= ContextUtil.getCurrentUser();
  3. filter.addParam("userId",user.getUserId());

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

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

编写自定分页代码

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

编写代码如下:

  1. public IPage getMyTurnTo(QueryFilter queryFilter){
  2. Map<String,Object> params= PageHelper.constructParams(queryFilter);
  3. return bpmInstCcMapper.getMyTurnTo(queryFilter.getPage(),params);
  4. }
  1. IPage getMyTurnTo(IPage page, @Param("w") Map<String, Object> params);
  1. <select id="getMyTurnTo" resultType="com.redxun.bpm.core.entity.BpmInstCc" parameterType="java.util.Map">
  2. select ID_,SUBJECT_,NODE_ID_,NODE_NAME_,FROM_USER_,FROM_USER_ID_,UPDATE_BY_,UPDATE_TIME_
  3. from BPM_INST_CC WHERE FROM_USER_ID_=#{w.userId}
  4. <if test="@rx.Ognl@isNotEmpty(w.whereSql)">
  5. and ${w.whereSql}
  6. </if>
  7. <if test="@rx.Ognl@isNotEmpty(w.orderBySql)">
  8. ORDER BY ${w.orderBySql}
  9. </if>
  10. <if test="@rx.Ognl@isEmpty(w.orderBySql)">
  11. ORDER BY CREATE_TIME_ DESC
  12. </if>
  13. </select>
文档更新时间: 2021-07-20 16:51   作者:zyg