通过aop和注解实现返回列表支持排序的字段;通过mybatis-plus的Page类的OrderItem属性进行排序
前言
通过aop和注解实现返回列表支持排序的字段;通过mybatis-plus的Page类的OrderItem属性进行排序
方案
| 序号 | 操作 |
|---|---|
| 1 | 通过aop和注解实现返回列表支持排序的字段 |
| 2 | 通过mybatis-plus的Page对象的OrderItem属性进行排序 |
类注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PageSort {
/**
* vo对应的类,包含可排序字段信息
*/
Class<?> clazz();
}
字段注解
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PageSortColumn {
/**
* 列名
* 不填写的话默认取ApiModelProperty注解的value值
*/
String value() default "";
/**
* 数据库排序字段
* 注意:如果字段不是来自主表,则需添加查询中的别名前缀,如: ler.create_time
* 不填写的话默认取 field->name并自动转化为下划线命名风格
*/
String column() default "";
}
aop实现
@Component
@Aspect
@Slf4j
@RequiredArgsConstructor
public class PageSortAspect {
/**
* 配置切入点
*/
@Pointcut("@annotation(com.zq.common.annotation.PageSort)")
public void logPointcut() {
// 该方法无方法体,主要为了让同类中其他方法使用此切入点
}
/**
* 配置环绕通知,使用在方法logPointcut()上注册的切入点
*
* @param joinPoint
* @return
*/
@Around("logPointcut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
PageSort pageSort = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(PageSort.class);
// handleQuery(pageSort, args, point);
Object proceed = joinPoint.proceed();
handleColumnInfo(pageSort, proceed);
return proceed;
}
private void handleColumnInfo(PageSort pageSort, Object proceed) {
try {
if (proceed instanceof TableDataInfo) {
TableDataInfo<?> res = (TableDataInfo<?>) proceed;
Field[] fields = ReflectUtil.getFields(pageSort.clazz());
List<BasePageColumnVO> columnList = new ArrayList<>();
for (Field field : fields) {
BasePageColumnVO columnInfo = getColumnInfo(field);
if (columnInfo == null) {
continue;
}
columnList.add(columnInfo);
}
res.setSortable(columnList);
}
} catch (Exception e) {
log.error("分页排序返回字段处理失败", e);
}
}
private BasePageColumnVO getColumnInfo(Field field) {
PageSortColumn sortColumn = field.getAnnotation(PageSortColumn.class);
if (sortColumn == null) {
return null;
}
String column = sortColumn.column();
String value = sortColumn.value();
if (StrUtil.isEmpty(sortColumn.column())) {
column = StrUtil.toUnderlineCase(field.getName());
}
if (StrUtil.isEmpty(value)) {
ApiModelProperty modelProperty = field.getAnnotation(ApiModelProperty.class);
value = modelProperty.value();
}
return new BasePageColumnVO(field.getName(), value, column);
}
}
测试
测试方法
@ApiOperation(value = "分页查询【支持自定义排序】")
@PostMapping("/pageByOrderItem")
@PageSort(clazz = MdAssemblyVO.class)
public TableDataInfo<MdAssemblyVO> pageByOrderItem(@RequestBody MdAssemblyPageQuery assemblyPageQuery) {
TableDataInfo<MdAssemblyVO> tableDataInfo = assemblyService.pageByOrderItem(assemblyPageQuery);
return tableDataInfo;
}
测试类
@Data
public class MdAssemblyVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "生产线ID")
private Long assemblyId;
@ApiModelProperty(value = "生产线编码")
@PageSortColumn
private String assemblyCode;
@ApiModelProperty(value = "生产线名称")
@PageSortColumn
private String assemblyName;
@ApiModelProperty(value = "是否启用")
@PageSortColumn
private String enableFlag;
@ApiModelProperty(value = "车间ID")
private Long workshopId;
@ApiModelProperty(value = "车间编码")
private String workshopCode;
@ApiModelProperty(value = "车间名称")
private String workshopName;
@ApiModelProperty(value = "部门id")
private Long deptId;
@ApiModelProperty(value = "部门名称")
private String deptName;
@ApiModelProperty(value = "创建时间")
@PageSortColumn
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新时间")
@PageSortColumn
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
查询条件,MdAssemblyPageQuery类
@Data
@EqualsAndHashCode(callSuper = false)
public class MdAssemblyPageQuery extends BasePageQuery implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "关键词搜索")
private String searchValue;
@ApiModelProperty(value = "生产线ID")
private Long assemblyId;
@ApiModelProperty(value = "生产线IDS")
private Set<Long> assemblyIds;
@ApiModelProperty(value = "是否启用")
private String enableFlag;
@ApiModelProperty(value = "物料产品ID")
private Long itemId;
@ApiModelProperty(value = "工站ID")
private Long workstationId;
}
查询条件基类,BasePageQuery类
@Data
@ApiModel
public class BasePageQuery {
@ApiModelProperty(value = "页码", example = "1")
protected Integer pageNum = 1;
@ApiModelProperty(value = "每页记录数", example = "10")
protected Integer pageSize = 10;
@ApiModelProperty(value = "规则配置所需拼接sql", hidden = true)
private String queryRuleSql;
@ApiModelProperty(value = "排序字段")
private List<OrderItem> orders;
@ApiModelProperty(value = "关键词关联的主表ID", hidden = true)
private Set<Long> keyIds;
public <T> BasePageVO<T> page() {
BasePageVO<T> basePage = new BasePageVO<>(pageNum, pageSize);
if (CollectionUtil.isNotEmpty(orders)) {
basePage.addOrder(orders);
}
return basePage;
}
}
Page类的OrderItem属性
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderItem implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 需要进行排序的字段
*/
private String column;
/**
* 是否正序排列,默认 true
*/
private boolean asc = true;
public static OrderItem asc(String column) {
return build(column, true);
}
public static OrderItem desc(String column) {
return build(column, false);
}
public static List<OrderItem> ascs(String... columns) {
return Arrays.stream(columns).map(OrderItem::asc).collect(Collectors.toList());
}
public static List<OrderItem> descs(String... columns) {
return Arrays.stream(columns).map(OrderItem::desc).collect(Collectors.toList());
}
private static OrderItem build(String column, boolean asc) {
return new OrderItem(column, asc);
}
}

浙公网安备 33010602011771号