| 不知道大家有没有碰到,还是没有这种需求。就是用like来查询,我们没有用Lucene,Compass这种全文索引的方案,我们只是简单的添加%进行
like查询。用户搜索的时候就使用*和?来代表任意和一个。所以要对"%"和"_"进行转义,我们使用的是oracle数据库。sql语句看起来可能是
这样的。SELECT * FROM t_user where nickname like '%Goo\_D' escape '\'这里对_进行转义了。因为用户昵称包含下划线,如果不进行转义就表示一个任意字符。有时候我们可能还需要对%进行转义。同样的方法在%前加\% 但是比起普通的like语句。多了一个声明转义符的语句。所以我们会想到这样的语句DetachedCriteria criteria = DetachedCriteria.forClass(User.class);criteria.add(Restrictions.like("nickname", user.getNickname()+"' escape'\"));但是这样是不管用的。接下来可能会想到使用Hibernate3的原生sql查询,其实我们不需要这样做。我们还是使用Criteria条件查询。criteria.add(Restrictions.sqlRestriction("{alias}.nickname like ? escape'/'", StringUtil.escapeSQLLike(user.getNickname()), Hibernate.STRING));这样Hibernate产生的语句就是我们想要的语句了。 /** * 转义like语句中的 * <code>'_'</code><code>'%'</code> * 将<code>'?'</code>转成sql的<code>'/_'</code> * 将<code>'%'</code>转成sql的<code>'/%'</code> * <p> * 例如搜索<code>?aa*bb?c_d%f</code>将转化成<br/> * <code>_aa%bb_c/_d/%f</code> * </p> * @param likeStr * @return * @author <a href="http://jdkcn.com">somebody</a> */ public static String escapeSQLLike(String likeStr) { String str = StringUtils.replace(likeStr, "_", "/_"); str = StringUtils.replace(str, "%", "/%"); str = StringUtils.replace(str, "?", "_"); str = StringUtils.replace(str, "*", "%"); return str; } |