自己的不小心。mybtis中 $ 与# 今天才注意到的用法问题

前言:

做一个sql不喜欢写xml但是公司又要求 ,之前个人是用mp的 各种爽,

今天写了一个复杂sql查询,普通条件用不上 ,产生以下的mybatis使用:

首先给出sql语句和相对应的写法

这里是sql

<select id="groupListMessage" parameterType="map" resultType="hashmap">
        SELECT g.id,g.group_name as nickname,g.group_icon as icon,mv.message,mv.message_type,mv.excuse_message,mv.state
        FROM message_verify mv left join groups g on mv.to_id=g.id
        <include refid="selectCondition" />
        ORDER BY mv.id DESC
    </select>
<sql id="selectCondition">
        <where>
           //省略一些定义的查询条件
            <trim suffixOverrides="AND">
                </if>
            <!--复杂的查询,使用sql完成-->
            <trim suffixOverrides="AND">
                <if test="whereSql != null">
                    AND #{whereSql}
                </if>
            </trim>
        </where>
    </sql>
selectCondition是我们逻辑上面的判断

这个时候书写逻辑

userAllGroupType.forEach(i->ids.add(i.getGroupId().toString()));
        String idsjoin = String.join(",", ids);

        HashMap<String, Object> queryMap = new HashMap<>();
        queryMap.put("whereSql","mv.message_type=2 AND mv.to_id IN ("+ idsjoin +")");
        return MessageVerifyDao.groupListMessage(queryMap);

业务很简单 就是为wheresql的时候,想要用自定义的sql

这里的sql是模版生成的,接下来执行查询

会发现查询不到数据在mybatis中 ,在mysql中是有数据的。

SELECT g.id,g.group_name as nickname,g.group_icon as icon,mv.message,mv.message_type,mv.excuse_message,mv.state FROM 数据库省略 mv left join 省略  g on mv.to_id=g.id WHERE ? ORDER BY mv.id DESC 
DEBUG 14360 --- [io-10033-exec-3]              : ==> Parameters: mv.message_type=2 AND mv.to_id IN (4)(String)
 DEBUG 14360 --- [io-10033-exec-3]          : <==      Total: 0

之后我进行了mysql查询 实实在在有一条数据,

一直想不通,

其实这个查询语句肯定没有错,

总结原因

mybatis中是有# $ 的区分 一个sql编译的时候#会产生"" ,$则不会,才会导致我的预编译注入字符串不识别出来,将whereSql

改为$就可以用了!!!

还是因为自己粗心大意。坐太久屁股疼脑子不好用!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值