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;
    }
    

你可能感兴趣的:(数据库设计)