问题描述
给出字符串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; }