如果使用如下方式编写SQL,会在查询的时候报错,报错内容大致是说没有找到参数:
| 1
2
3
 | 
select * from t_user where account like '%#{account}%'
 | 
 
需要修改成如下sql:
| 1
2
3
 | 
select * from t_user where account like #{account}%
 | 
 
但是这种修改是不符合我们业务逻辑的,我们要的就是有百分号的查询。我们项目中解决该问题的方式是传入account的值时,在代码中加上百分号,这是一种我绝对无法接受的方案,这样的代码实在是不优雅:
   
我在查询资料并实践后,排除了如下方案:
- 使用"%"#{account}"%",可能因为我们使用的是pg,该方案行不通
- 使用CONCAT('%', #{account}, '%'),同样的可能因为我们使用的是pg,该方案行不通
最后我确认了使用MyBatis提供的bind标签的方案(该方案已经实践,能够成功的查询到数据):
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 | 
<select id="pageUserInMaterialByAccount" resultType="com.sdstc.authcenter.pojo.User">
    <bind name="account" value="'%' + account + '%'"/>
    SELECT tu.*
    FROM t_user tu
    JOIN t_auth_group_user_role tagur ON tu.ID = tagur.user_id
    WHERE tagur.app_id = '200'
    AND tagur.is_delete = '0'
    AND tu.is_delete = '0'
    and tu.account like #{account}
</select>
 | 
 
这个方案最大的问题在于,增加了一个标签,导致Idea的自动排版不好使了。
参考资料
- [MyBatis]模糊查询LIKE的三种方式
- MyBatis Like 模糊查询解决策略