如果使用如下方式编写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 模糊查询解决策略