Mybatis复杂sql写法:注解+内部类来实现

代码如下:

@Mapper
@Component
public interface DynamicDataMapper {

    /**
     * 根据名称查询动态数据结果
     * @param dataConditionBO 筛选条件
     * @return
     */
    @SelectProvider(type = DynamicDataDaoProvider.class, method = "findRobotDynamicDataByCondition")
    RobotDataResultDO  findRobotDynamicData(DataConditionBO dataConditionBO);

    class DynamicDataDaoProvider {
        public String findRobotDynamicDataByCondition(DataConditionBO dataConditionBO) {
            StringBuilder sqlBuilder = new StringBuilder();
            sqlBuilder.append(" SELECT `rdd`.`id`,`rdd`.`name`, `rdd`.`value`,GROUP_CONCAT(\"{\",w_key,\":\",w_value,\"}\") as `condition` FROM `robot_dynamic_data` AS `rdd` JOIN `robot_dynamic_data_condition` AS `rddc` ON `rdd`.`id` = `rddc`.`dynamic_data_id` ");
            String name = dataConditionBO.getName();
            sqlBuilder.append(" WHERE `rdd`.`name`='").append(name).append("' ");

            sqlBuilder.append(" GROUP BY `rdd`.`id` ");
            if (Objects.nonNull(dataConditionBO.getCondition()) && !dataConditionBO.getCondition().isEmpty()) {
                sqlBuilder.append(" HAVING ");
                int index = 0;
                for (Map.Entry<String, String> entry: dataConditionBO.getCondition().entrySet()) {
                    index++;
                    String whereClause = " Find_In_Set('{"+entry.getKey()+":"+entry.getValue()+"}',`condition`) ";
                    sqlBuilder.append(whereClause);
                    if (index < dataConditionBO.getCondition().size()) {
                        sqlBuilder.append(" AND ");
                    }
                }
            }


            return sqlBuilder.toString();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值