更优雅的处理Like查询(其实也不太优雅)

如果使用如下方式编写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的值时,在代码中加上百分号,这是一种我绝对无法接受的方案,这样的代码实在是不优雅:

2021-09-02-15-42-46

我在查询资料并实践后,排除了如下方案:

  1. 使用"%"#{account}"%",可能因为我们使用的是pg,该方案行不通
  2. 使用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的自动排版不好使了。

参考资料

  1. [MyBatis]模糊查询LIKE的三种方式
  2. MyBatis Like 模糊查询解决策略