首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate like 施用

2012-11-06 
Hibernate like 使用问题域:String hql from User as user where user.name like ?Query queryquery

Hibernate like 使用
问题域:

String hql = "from User as user where user.name like ?";Query query=querysession.createQuery(hql);   query.setParameter(0,"javaeye");
查询无结果.或者只查到user名称为"javaeye"的用户。
我想根据用户的姓名,昵称等多条件支持中文查询?

问题解析一:
理解like匹配模式
LIKE 'Mc%'    将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
LIKE '%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
LIKE '%en%'   将搜索在任何位置包含字母 en 的所有字符串
                (如 Bennet、Green、McBadden)。
LIKE '_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称
                (如 Cheryl、Sheryl)。
LIKE '[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson
              和 Karson(如 Carson)。
LIKE '[M-Z]inger' 将搜索以字符串 inger 结尾、
                 以从M到Z的任何单个字母开头的所有名称如 。
LIKE 'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有
                名称(如 MacFeather)。
分析:
采用位置占位符可以解决查询中文的问题;
但是如果有过多的like查询则要考虑用名称占位符;
上例子改为如下即可:
String hql = "from User as user where user.name like :name";             +" and user.alias like :alias";Query query=querysession.createQuery(hql); query.setParameter(name,"%javaeye%");query.setParameter(alias,"%eye");


这样的方式即支持多条件中文查询。

如果要查出不匹配的结果。就采用not like 关键字
例如:
String hql = "from User as user where user.name not like :name";             Query query=querysession.createQuery(hql); query.setParameter(name,"%javaeye%");


注意:如果你采用的是直接拼凑的hql或者sql语句,在用到like的时候要考虑到客户端可能
      采用特殊字符搜索。例如"&" ,"%", "_","_s_"
     为防止这样的漏洞要去检验参数数值。
      如果采用Hibernate的占位符方式则暂不用考虑这个问题。

热点排行