mysql单字段任意字符匹配模糊查询

问题描述

给出字符串String str=”高明亮”(该字符串由前台传递,动态变化);查出用户表中用户名包含以上字符串任意字符的所有用户信息。

可能的思路

  • 错误思路一:只会查询出同时包含着三个字符的用户名。

    select * from user where userName like ‘%高%明%亮%’;

  • 错误思路二:语法就不对,只能查询出包含“高”的用户名。

    select * from user where userName like ‘%高%’ or '%明%' or '%亮%';

  • 错误思路三:结果正确。动态参数,拼接sql难度大。

    select * from user where userName like ‘%高%’ or userName like '%明%' or userName like '%亮%';

  • 错误思路三:动态参数,拼接sql难度大。

    select * from user where userName like ‘%高%’ or userName like '%明%' or userName like '%亮%';

  • 错误思路四:查询结果为空,原因:mysql内部正则有自己的规则;可以考虑将“like”换成“rlike”或者“REGEXP”。不过,在hibernate中不支持这种方式;并且,查询结果还是不对(原因不太清楚)。

    select * from user where userName like ‘%[高明亮]%’;

测试正确的方式

  • select * from user where userName REGEXP ‘高|明|亮’;
  • 在hibernate中使用采用sql语句方式即可,不要使用hql,不支持。大致如下

    Query query = getSession().createSQLQuery("select * from UsersInfor where userName REGEXP ?");
    // HQL不支持
    // Query query = getSession().createQuery("from " +
    // UsersInfor.class.getSimpleName() + " where userName REGEXP ?");
    query.setParameter(0, word);
    query.setFirstResult(Contants.Pager.pagerSize * (page - 1));// 设置起始行
    query.setMaxResults(Contants.Pager.pagerSize);// 每页条数
    if (query.list() != null && !query.list().isEmpty()) {
        return query.list();
    } else {
        return null;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值