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