拼接sql字符串工具类

  1. 申明注解
java 复制代码
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface StrSqlAnnotation {
    /**
     * 表字段名称,如"create_name"
     *
     * @return
     */
    String filedName() default "";

    /**
     * 类型 STR-字符串 LIST-集合
     * {@link com.ltd.ccci.svc.transport.api.constant.CommonSymbolConstant}
     *
     * @return
     */
    String type() default CommonSqlKeyWordConstant.LIKE_IN_TYPE;

}
  1. 相关常量类
    a. sql拼接常量:CommonSqlKeyWordConstant
java 复制代码
public class CommonSqlKeyWordConstant {
    public static final String AND = "AND ";

    public static final String OR = "OR";

    public static final String NOT = "NOT";

    public static final String IN = "IN";

    public static final String NOT_IN = "NOT IN";

    public static final String LIKE = "LIKE";

    public static final String NOT_LIKE = "NOT LIKE";

    public static final String EQ = "=";

    public static final String NE = "<>";

    public static final String GT = ">";

    public static final String GE = ">=";

    public static final String LT = "<";

    public static final String LE = "<=";

    /**
     * 搜索条件-like or eq
     */
    public static final String LIKE_IN_TYPE = "LIKE_IN_TYPE";

}

b. 符号常量:CommonSymbolConstant(可不使用)

java 复制代码
public class CommonSymbolConstant {
    private CommonSymbolConstant() {
    }

    /**
     * 横杠
     */
    public static final String BAR = "-";

    /**
     * 波浪号
     */
    public static final String TILDE = "~";

    /**
     * 下划线
     */
    public static final String UNDERLINE = "_";


    /**
     * 斜杠
     */
    public static final String SLASH = "/";


    /**
     * 冒号
     */
    public static final String COLON = ":";


    /**
     * 分号
     */
    public static final String SEMICOLON = ";";


    /**
     * 逗号
     */
    public static final String COMMA = ",";

    /**
     * 点
     */
    public static final String POINT = ".";

    /**
     * 顿号
     */
    public static final String PAUSE = "、";

    /**
     * 点
     */
    public static final String EMPTY = "";

    /**
     * 空格
     */
    public static final String BLANK = " ";


    /**
     * 单引号
     */
    public static final String SINGLE_QUOTES = "'";

    /**
     * 正括号
     */
    public static final String OPEN_BRACKET = "(";
    /**
     * 反括号
     */
    public static final String CLOSE_BRACKET = ")";
}
  1. 工具类:SearchUtil
java 复制代码
public class SearchUtil {


    /**
     * 翻译单个实体
     *
     * @param obj 实体信息
     */
    public static <T, V> QueryWrapper<V> getSearchWrapper(T obj, Class<V> ignoredClazz) {
        QueryWrapper<V> wrapper = new QueryWrapper<>();
        // 防止未传条件不拼接where条件
        if (!ObjectUtil.isEmpty(obj)) {
            try {
                Class<?> aClass = obj.getClass();
                Map<String, Field> fields = getAllFileds(aClass);
                for (Field field : fields.values()) {
                    if (field.isAnnotationPresent(StrSqlAnnotation.class)) {
                        field.setAccessible(true);
                        StrSqlAnnotation annotation = field.getAnnotation(StrSqlAnnotation.class);
                        String filedName = annotation.filedName();
                        if (StringUtils.isBlank(filedName)) {
                            filedName = StrUtil.toUnderlineCase(field.getName());
                        }
                        String type = annotation.type();
                        Object object = field.get(obj);
                        if (ObjectUtil.isNotEmpty(object)) {
                            Class<?> filedClass = object.getClass();
                            String str = object.toString().trim();
                            // 日期格式单独转化
                            if (filedClass.equals(LocalDateTime.class)) {
                                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
                                str = ((LocalDateTime) object).format(dateTimeFormatter);
                            } else if (filedClass.equals(LocalDate.class)) {
                                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN);
                                str = ((LocalDate) object).format(dateTimeFormatter);
                            }

                            switch (type) {
                                // like in
                                case CommonSqlKeyWordConstant.LIKE_IN_TYPE -> {
                                    String[] split = str.split(",");
                                    if (split.length > 1) {
                                        wrapper.in(filedName, Arrays.asList(split));
                                    } else {
                                        wrapper.like(filedName, str);
                                    }
                                }
                                // in
                                case CommonSqlKeyWordConstant.IN -> {
                                    String parse = JSONUtil.toJsonStr(object);
                                    List<String> list = JSONUtil.toList(parse, String.class);
                                    // LocalDateTime类型如果是集合传入,接收时类型为Long。时间集合建议传List<String>
                                    if (CollUtil.isNotEmpty(list)) {
                                        wrapper.in(filedName, list);
                                    }
                                }

                                // like
                                case CommonSqlKeyWordConstant.LIKE -> wrapper.like(filedName, str);

                                // =
                                case CommonSqlKeyWordConstant.EQ -> wrapper.eq(filedName, str);
                                // >=
                                case CommonSqlKeyWordConstant.GE -> wrapper.ge(filedName, str);

                                // <=
                                case CommonSqlKeyWordConstant.LE -> wrapper.le(filedName, str);
                                default -> {
                                }
                            }
                        }
                    }
                }
            } catch (Exception e) {
                throw new ApiException(MsgUtils.getMessage("biz.common.StrFiledError"));
            }
        }
        return wrapper;
    }

    /**
     * 获取所有字段含父级
     *
     * @param aClass 实体类
     * @return 所有字段信息
     */
    private static Map<String, Field> getAllFileds(Class<?> aClass) {
        // key-字段名  value-字段信息
        Map<String, Field> fileds = new HashMap<>();
        List<Field> fieldList = new ArrayList<>();
        Class<?> tempClass = aClass;
        //当父类为null的时候说明到达了最上层的父类(Object类).
        while (tempClass != null) {
            fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
            //得到父类,然后赋给自己
            tempClass = tempClass.getSuperclass();
        }
        for (Field field : fieldList) {
            fileds.put(field.getName(), field);
        }
        return fileds;
    }
    
}
  1. 使用示例
    实体类注解使用
java 复制代码
    @Schema(title = "线路编号")
    @StrSqlAnnotation(filedName = "no")
    private String no;


    @Schema(title = "物流供应商编码-单个查询-精确查询")
    @StrSqlAnnotation(type = CommonSqlKeyWordConstant.EQ)
    private String logisticsSupplierCode;

    @Schema(title = "物流合同号")
    @StrSqlAnnotation()
    private String logisticsContractNo;

   @Schema(title = "物流供应商编码")
    @StrSqlAnnotation(filedName = "logistics_supplier_code", type = CommonSqlKeyWordConstant.IN)
    private List<String> logisticsSupplierCodes;

LambdaQueryWrapper使用示例

java 复制代码
private LambdaQueryWrapper<LineMainDO> dealSearchInfo(LinePageReq req, SFunction<LineMainDO, ?> sortFiled, boolean whetherAsc) {
        LambdaQueryWrapper<LineMainDO> lambdaQuery = SearchUtil.getSearchWrapper(req, LineMainDO.class).lambda();
        if (CollUtil.isEmpty(req.getSortItems())) {
            lambdaQuery.orderBy(true, whetherAsc, sortFiled);
        }
        return lambdaQuery;
    }

xml使用示例

service

java 复制代码
    public CommonPage<ReceiptPageDTO> queryPage(ReceiptPageReq req) {
          QueryWrapper<ReceiptMainDO> searchWrapper = SearchUtil.getSearchWrapper(req, ReceiptMainDO.class);
        IPage<ReceiptPageDTO> page = receiptMainMapper.queryPage(MPPager.buildPage(req), searchWrapper);
        return MPCommonPage.restPage(page );
    }

mapper

java 复制代码
  /**
     * 运输签收分页(明细联表)
     *
     * @param ipage 分页信息
     * @param sql   高级搜索条件sql
     * @return 分页信息
     */
    IPage<ReceiptPageDTO> queryPage(Page<ReceiptMainDO> ipage, @Param(Constants.WRAPPER) QueryWrapper<ReceiptMainDO> sql);

xml

java 复制代码
 <select id="queryPage" resultType="com.ltd.ccci.svc.transport.api.dto.receipt.ReceiptPageDTO">
        <select id="queryPage" resultType="com.ltd.ccci.svc.transport.api.dto.receipt.ReceiptPageDTO">
        SELECT *
        FROM receipt_main m,
        receipt_detail d
        <choose>
            <when test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
                ${ew.customSqlSegment} and
            </when>
            <otherwise>
                where
            </otherwise>
        </choose>
        m.id = d.receipt_main_id
        and d.del_flag = 0
        and m.del_flag = 0
        order by m.update_time, d.create_time, d.id
    </select>
相关推荐
陈王卜16 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、17 分钟前
Spring Boot 注解
java·spring boot
java亮小白199722 分钟前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF28 分钟前
java Queue 详解
java·队列
VertexGeek32 分钟前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
石小石Orz33 分钟前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
武子康1 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
苏-言1 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
界面开发小八哥1 小时前
更高效的Java 23开发,IntelliJ IDEA助力全面升级
java·开发语言·ide·intellij-idea·开发工具