本站首页    管理页面    写新日志    退出


«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7648567
建立时间:2006年5月29日




[Hibernate]关于Hibernate3的escape解决方法
软件技术

lhwork 发表于 2006/10/17 9:58:04

不知道大家有没有碰到,还是没有这种需求。就是用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;    }


阅读全文(2308) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144803171 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号