前言:
做一个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
改为$就可以用了!!!
还是因为自己粗心大意。坐太久屁股疼脑子不好用!