记一次拼接Sql的问题

    <select id="queryList" parameterType="java.lang.String" resultType="com.hengtn.evaluation.dto.response.EvaluationRecordResponseDTO">
        SELECT
        r.id AS id,
        r.create_time AS createTime,
        r.city_name AS cityName,
        r.star_level AS starLevel,
        r.status AS status,
        r.user_phone AS userPhone,
        r.user_id AS userId,
        GROUP_CONCAT(o.worker_name) AS workerName,
        o.order_number AS orderNumber,
        r.label AS label,
        r.content_text AS contentText
        FROM
        evaluation_record r
        JOIN evaluation_record_order o ON r.id = o.record_id
        WHERE 1=1

        ${param}

        GROUP BY id
        ORDER BY
        FIELD( 'status', 'PENDING', 'PROCESSED', 'NOPENDING' ),
        r.star_level,
        r.create_time

    </select>

如上xml所示,如果用#{param}则会报sql语句错误,使用${}则能成功运行

原因为,#{param}会在参数的基础上在做一层处理,就会导致传入拼接好的字符串param发生改变,sql解析发生错误.

这也是#{}有效能防止sql注入的原因

另外, GROUP_CONCAT(o.worker_name) AS workerName 能合并多个因为分组而重合的列

GROUP BY id,适合处理一对多的情况

ORDER BY FIELD( 'status', 'PENDING', 'PROCESSED', 'NOPENDING' ) 可以根据列对应的值排序,OREDER BY 后的多个排序条件用逗号隔开。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值