我正在使用hibernate 3.6并且我在使用criteria.list时遇到了问题。我需要带引号或重音的搜索词,例如“d'eau”或“d'eau”。我的代码是这样的:
Criteria criteria;
criteria.add(Restrictions.ilike("nameParam", "d''eau", MatchMode.ANYWHERE));
我放了两个单引号,因为我正在使用sql server数据库。有2个单引号,因为单引号转义与另一个单引号。 该语句有0个结果,但如果我执行sql语句打印在sql server客户端的日志中,我得到120个结果aprox。
使用HQL和相同的sql语句进行测试。我明白了:
String hqlQuery = "select distinct(t) from Table t where b.idCon in (select t2.idCon from Table t2 where lower(t2.outTerTb) like '%d''eau%')";
List qwer = getEntityManager().createQuery(hqlQuery).getResultList();
System.out.println("qwer.size() -> " + qwer.size());
String hqlQuery2 = "select distinct(t) from Table t where b.idCon in (select t2.idCon from Table t2 where lower(t2.outTerTb) like :param)";
List qwer2 = getEntityManager().createQuery(hqlQuery2).setParameter("param", "%d''eau%").getResultList();
System.out.println("qwer2.size() -> " + qwer2.size());
此代码打印:
qwer.size() -> 120
qwer2.size() -> 0
我不明白为什么会这样。 对不起,如果我的英语不好
答案 0 :(得分:1)
您无需在参数中转义单引号。这是使用参数的全部要点(在Hibernate中,在幕后,在JDBC预处理语句中):JDBC驱动程序会逃避需要为您转义的所有内容。
您可以将UI层中的内容原样并将其填充到参数中,驱动程序会对所有内容进行适当的转义,并且您不会冒任何SQL注入攻击的风险。