请教HQL中java中需要转义的字符问题

30359人阅读
public List getOrgan(String organCode, String organName) {
&&& if (organCode != null && organCode.length() & 0) {
&&&& hsql = &from Ab31 where bae002 = ? and aab061 like ?&;
&&&& list = getHibernateTemplate().find(hsql, new Object[] { organCode,
'%' + organName + '%' });
&&& else {
&&&& hsql = &from Ab31 where aab061 like ?&;
&&&& list = getHibernateTemplate().find(hsql, '%' + organName + '%');
我在HQL中like查询的时候按照SQL语法用双引号组合 &%' &+ organName
+ &'%& 查不到任何结果,所以必须注意这里只能使用单引号,如:'%' + organName
+ '%' ,多个【占位符】用new Object[] { organCode,
organName } 来填充
like语法简介:
%&&& 表示任意个数的任意字符
_&&& 表示任意一个字符
[abcdefg]&& 表示里面的字符任何一个,只取一个
[^c]&&&&&&&&&& 表示里面的字符不包含c
[a-z]&&&&&&&&& 表示区间中的任一个,如c或d等
[^a-z]&&&&&&& 表示非区间中的任一个
escape '/'&&&& 转义符,表示/之后的字符不是特殊字符。
like '%商品/%模板%' escape '/'&&& 可以查出&& 商品%模板 特殊字符
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:306230次
积分:2928
积分:2928
排名:第11962名
原创:46篇
转载:54篇
评论:18条
(1)(2)(2)(1)(2)(1)(3)(10)(3)(3)(13)(7)(24)(4)(14)(8)(2)拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(38d9e0f3c169439a-ua98).
重新安装浏览器,或使用别的浏览器hibernate中使用查询时,如何处理特殊字符? - Hibernate - New - ITeye论坛
hibernate中使用查询时,如何处理特殊字符?
锁定老帖子
该帖已经被评为新手帖
发表时间:&&
相关知识库:
例如:数据库中的字符字段中如果含有特殊字符 " ' % , 如果用户输入了这些字符,直接使用肯定会冲突,对于这些字符如何转义?如果有相应的程序就更好了。再此表示感谢!
发表时间:&&
唉,太郁闷了!!!!也没有人help。。。。
有时候,技术问题就是这样,知道的人一点就可。可是如果不知道不知要费多少劲。
我在hibernate的论坛上也查了,有人问,没人答。。。
请登录后投票
积分: 2516
来自: 上海
发表时间:&&
使用占位符查询,而不是拼String
请登录后投票
发表时间:&&
不是很明白。。能再详细点吗?
请登录后投票
发表时间:&&
请google“占位符查询”或“Hibernate+占位符查询”
有点好奇你的两颗星是怎么挣来的???
请登录后投票
发表时间:&&
因为好奇,看了一下楼主的资料,你03年就在用Hibernate了(尽管04、05、06、07四年一直潜水),但怎么还在问这种问题?
请登录后投票
发表时间:&&
movingboy ,批评的太有道理了。我是很早就使用hibernate了,但是很多问题当时就是能用即可。没有做很深刻的研究。接收你的批评。潜心学习!
请登录后投票
跳转论坛:移动开发技术
Web前端技术
Java企业应用
编程语言技术7465人阅读
Hibernate(10)
&&不知道大家有没有碰到,还是没有这种需求。就是用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&
例如搜索&code&?aa*bb?c_d%f&/code&将转化成&br/&
&code&_aa%bb_c/_d/%f&/code&
* @param likeStr
* @author &a href="" mce_href=""&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, "*", "%");
上段引自:
总觉得自己被面象对象中毒太深,如果用上面的方法,就必须把数据库表的字段表写入SQL内,有点不爽,所以想方设法改造。
新建两个类:IlikeExpressionEx和RestrictionsUtils,一看就知道是对Hibernate的IlikeExpression和Restrictions的扩展,可惜Restrictions没有提供protected级别以上的构造方法,没法继承。不过也没关系,毕竟Restrictions中的方法都是静态的,于是:
public class RestrictionsUtils{
public RestrictionsUtils(){
* @description:处理字符串中含转义字符问题
public static Criterion ilike(final String propertyName, String value, MatchMode matchMode) {
return new IlikeExpressionEx(propertyName, value, matchMode);
public class IlikeExpressionEx extends IlikeExpression{
private final String propertyN
private final O
protected IlikeExpressionEx(String propertyName, Object value) {
super(propertyName, value);
this.propertyName = propertyN
this.value = value.toString();
protected IlikeExpressionEx(String propertyName, String value, MatchMode matchMode) {
this( propertyName, matchMode.toMatchString(StringUtils.escapeSQLLike(value.toString())));
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException {
Dialect dialect = criteriaQuery.getFactory().getDialect();
String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
if (columns.length!=1) throw new HibernateException("ilike may only be used with single-column properties");
if ( dialect instanceof PostgreSQLDialect ) {
return columns[0] + " ilike ? escape '/'";
return dialect.getLowercaseFunction() + '(' + columns[0] + ") like ? escape '/'";
之后,要用到类似于Restrictions.ilike("contactTelphone", userTel, MatchMode.ANYWHERE)的地方,只要稍作修改:
RestrictionsUtils.ilike("contactTelphone", userTel, MatchMode.ANYWHERE)即可
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:168915次
积分:2137
积分:2137
排名:第17615名
原创:46篇
转载:17篇
评论:43条
(1)(1)(3)(6)(10)(1)(4)(1)(1)(1)(4)(8)(1)(5)(5)(5)(2)(3)(1)SQL或HQL预编译语句,能够防止SQL注入,但是不能处理%和_特殊字符
最近项目在做整改,将所有DAO层的直接拼接SQL字符串的代码,转换成使用预编译语句的方式。个人通过写dao层的单元测试,有以下几点收获。
dao层代码如下
//使用了预编译sql
public List&IndvConfigModel& selectConfigBySuffix(String suffix)
String hql = &from IndvConfigModel where configKey like '%'||?||'%'&;
return this.selectConfigByHQL(hql, new Object[]{suffix});
单元测试代码和执行结果如下:
public void testLike()
List&IndvConfigModel& list = dao.selectConfigBySuffix(&picQual&);
Assert.assertEquals(list.size(), 2);// 1.true
list = dao.selectConfigBySuffix(&picQua%&);
Assert.assertEquals(list.size(), 2);// 2.true
list = dao.selectConfigBySuffix(&pic'Qual&);
Assert.assertEquals(list.size(), 0);//3. true
1、第一个断言是true,说明上面的做法,的确能够起到模糊查询的效果
2、第二个断言是true,说明%被认为是模糊匹配,并没有被oracle看成普通的字符。这说明预编译语句,是不能处理参数值中的特殊字符的。遇到%和_这种模糊查询的特殊字符,需要使用者自己转义.
3、第三个断言没有报异常。说明:预编译语句已经对oracle的特殊字符单引号,进行了转义。即将单引号视为查询内容,而不是字符串的分界符。
由于SQL注入其实就是借助于特殊字符单引号,生成or 1= 1这种格式的sql。预编译已经对单引号进行了处理,所以可以防止SQL注入}

我要回帖

更多关于 java中转义字符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信