我正在使用休眠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语句,则会得到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


而且我不明白为什么会这样。
对不起,如果我的英语不好

最佳答案

您无需在参数中转义单引号。这就是使用参数的全部要点(在Hibernate中以及在后台,在JDBC Prepared语句中):JDBC驱动程序转义了需要为您转义的所有内容。

您可以直接使用来自UI层的内容,并将其填充到参数中,所有内容都可以由驱动程序正确地转义,并且无需冒任何SQL注入攻击的风险。

关于java - hibernate 条件。列出带有引号和重音的不良结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10751942/

10-11 22:25
查看更多