叙太阳 2023-04-22 19:10 采纳率: 37.5%
浏览 54
已结题

mybatis编写sql语句时的问题

打印attrList的结果为:[{11=32}, {12=33}]
执行:

    <select id="searchSkus" resultMap="SkuResultMap">
        SELECT DISTINCT s.id, s.sku_name, s.price, s.sku_default_img
        FROM sku s
        INNER JOIN sku_attr_value sav ON s.id = sav.sku_id
        <where>
            s.is_deleted = 0
            <if test="keyword != null and keyword != ''">
                AND s.sku_name LIKE CONCAT('%', #{keyword}, '%')
            </if>
            <if test="tmId != null and tmId != ''">
                AND s.tm_id = #{tmId}
            </if>
            <if test="attrList != null and !attrList.isEmpty()">
                AND (
                <foreach collection="attrList" item="pair" separator=" OR ">
                    (sav.attr_id = #{pair.key} AND sav.value_id = #{pair.value})
                </foreach>
                )
            </if>
        </where>
        <choose>
            <when test="order == '1:asc'">
                ORDER BY s.id ASC
            </when>
            <when test="order == '1:desc'">
                ORDER BY s.id DESC
            </when>
            <when test="order == '2:asc'">
                ORDER BY s.price ASC
            </when>
            <when test="order == '2:desc'">
                ORDER BY s.price DESC
            </when>
            <otherwise>
                ORDER BY s.id
            </otherwise>
        </choose>
        LIMIT #{offset}, #{pageSize}
    </select>

之后,用idea的mybatis log插件打印出的sql语句为:


    SELECT
        DISTINCT s.id,
        s.sku_name,
        s.price,
        s.sku_default_img 
    FROM
        sku s 
    INNER JOIN
        sku_attr_value sav 
            ON s.id = sav.sku_id 
    WHERE
        s.is_deleted = 0 
        AND s.sku_name LIKE CONCAT('%', '手机', '%') 
        AND (
            (
                sav.attr_id = 11 
                AND sav.value_id = 32
            ) 
            OR (
                sav.attr_id = 12 
                AND sav.value_id = 33
            ) 
        ) 
    ORDER BY
        s.id DESC LIMIT 0,
        10;

但将


            <if test="attrList != null and !attrList.isEmpty()">
                AND (
                (sav.attr_id = 11 AND sav.value_id = 32)
                OR
                (sav.attr_id = 12 AND sav.value_id = 33)
                )
            </if>

换为:

            <if test="attrList != null and !attrList.isEmpty()">
                AND (
                <foreach collection="attrList" item="pair" separator=" OR ">
                    (sav.attr_id = #{pair.key} AND sav.value_id = #{pair.value})
                </foreach>
                )
            </if>

之后,打印的sql语句却变成了:

    SELECT
        DISTINCT s.id,
        s.sku_name,
        s.price,
        s.sku_default_img 
    FROM
        sku s 
    INNER JOIN
        sku_attr_value sav 
            ON s.id = sav.sku_id 
    WHERE
        s.is_deleted = 0 
        AND s.sku_name LIKE CONCAT('%', ?, '%') 
        AND (
            (
                sav.attr_id = '手机' 
                AND sav.value_id = null
            ) 
            OR (
                sav.attr_id = null 
                AND sav.value_id = null
            ) 
        ) 
    ORDER BY
        s.id DESC LIMIT null,
        0,
        10;

这个sql语句完全错了,为什么?难道

            <if test="attrList != null and !attrList.isEmpty()">
                AND (
                (sav.attr_id = 11 AND sav.value_id = 32)
                OR
                (sav.attr_id = 12 AND sav.value_id = 33)
                )
            </if>

            <if test="attrList != null and !attrList.isEmpty()">
                AND (
                <foreach collection="attrList" item="pair" separator=" OR ">
                    (sav.attr_id = #{pair.key} AND sav.value_id = #{pair.value})
                </foreach>
                )
            </if>

不等价吗?还是attrList的格式需要更改?

  • 写回答

4条回答 默认 最新

  • Mini厂程序员 2023-04-22 20:30
    关注

    想问下题主,这个attrList里面的对象类型是map吗?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月30日
  • 已采纳回答 4月22日
  • 修改了问题 4月22日
  • 赞助了问题酬金15元 4月22日
  • 展开全部

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装