mybatis-plus——实现动态字段排序,根据实体获取字段映射数据库的具体字段

前言

前端需要根据表头的点击控件可以排序,虽然前端能根据当前页的数据进行对应字段的排序,但也仅局限于实现当前页的排序,无法满足全部数据的排序,所以需要走接口的查询进行排序,获取最全的排序数据

实现方案

  1. 前端将排序的字段通过接口传入{"column":"dtCreateTime","order":"ASC"}
  2. 后端使用 mybatis-plus 的TableInfoHelper获取到字段映射的数据库字段
  3. 组装 order by 然后放置在LambdaQueryWrapper.last(orderSql)方法中

关键代码摘录

目前就简单考虑传入一个字段进行排序,多个可以使用逗号分隔等等,具体情况具体实现。

/**  
 * 根据查询条件拼接得到order by语句  
 * @param req 分页查询条件  
 * @return String  
 */
 public String getOrderByStatement(PageReq req) {  
    if (StringUtils.isNoneBlank(req.getColumn(), req.getOrder())) {  
        TableInfo tableInfo = TableInfoHelper.getTableInfo(EntityDemo.class);  
        List<TableFieldInfo> fieldList = tableInfo.getFieldList();  
        Optional<String> colum = fieldList.stream()  
                .filter(v -> StringUtils.equals(v.getEl(), req.getColumn()))  
                .findFirst()  
                .map(TableFieldInfo::getColumn);  
        if (colum.isPresent()) {  
            return String.format(" order by %s %s", colum.get(), req.getOrder());  
        }  
    }  
    return null;  
}

将上述的 order by 的 sql 放置在 LambdaQueryWrapper 生成的 sql 最后

String orderSql = getOrderByStatement(req);  
LambdaQueryWrapper<EntityDemo> queryWrapper = Wrappers.lambdaQuery(EntityDemo.class)  
        .查询条件 
        .last(StringUtils.isNotBlank(orderSql), orderSql);

总结

或许上面的方案不是比较好的方案,但是可以避免驼峰转换(数据库库区分字段大小写)和非表字段错误的情况。
上面并不是生产环境的代码,只是为了说明情况简化的代码。但核心还是TableInfoHelper,最后,祝各位玩的愉快。

### MyBatis-Plus数据库字段映射配置及使用方法 #### 自动转换驼峰命名至下划线 MyBatis-Plus 默认会将 Java 类中的驼峰命名法自动转换为 SQL 表格里的下划线分隔形式。这意味着对于名为 `userName` 的属性,默认情况下会被映射到名为 `user_name` 的列上[^1]。 然而,当遇到数据库字段同样采用驼峰命名的情况时,则可能会引发错误。此时可以通过多种方式来解决问题: #### 使用注解指定字段名称 为了确保特定的字段能够正确地被映射到对应的数据库列,可以利用 `@TableField` 注解显式定义这一关系。例如,在实体类中声明如下: ```java public class User { @TableId private Long id; @TableField("errorMsg") private String errorMsg; // ...其他属性和方法 } ``` 这里通过 `@TableField(value="errorMsg")` 明确指定了该成员变量应关联于数据库表内的 `errorMsg` 列[^2]。 #### 处理特殊类型的字段映射 针对一些特殊的场景,比如加密/解密操作或是 JSON 字段处理,还可以借助自定义类型处理器(`TypeHandler`)实现更复杂的逻辑。具体做法是在相应字段上方添加带有 `typeHandler` 参数的 `@TableField` 或者直接在实体类级别应用 `@TableName(autoResultMap=true)` 来开启全局的结果集映射功能[^3][^4]: ```java @TableField(typeHandler=CustomJsonTypeHandler.class) private Map<String,Object> extraInfo; ``` 以上就是关于 MyBatis-Plus 如何进行数据库字段映射的一些常见解决方案和技术细节介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值