不知道大家有没有碰到,还是没有这种需求。就是用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" mce_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;
}
上段引自:http://blog.csdn.net/newfox/archive/2006/10/16/1337445.aspx
总觉得自己被面象对象中毒太深,如果用上面的方法,就必须把数据库表的字段表写入SQL内,有点不爽,所以想方设法改造。
新建两个类:IlikeExpressionEx和RestrictionsUtils,一看就知道是对Hibernate的IlikeExpression和Restrictions的扩展,可惜Restrictions没有提供protected级别以上的构造方法,没法继承。不过也没关系,毕竟Restrictions中的方法都是静态的,于是:
public class RestrictionsUtils{
public RestrictionsUtils(){
}
/**
*
* @description:处理字符串中含转义字符问题
* @return
*/
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 propertyName;
private final Object value;
protected IlikeExpressionEx(String propertyName, Object value) {
super(propertyName, value);
this.propertyName = propertyName;
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 '/'";
}
else {
return dialect.getLowercaseFunction() + '(' + columns[0] + ") like ? escape '/'";
}
}
}
之后,要用到类似于Restrictions.ilike("contactTelphone", userTel, MatchMode.ANYWHERE)的地方,只要稍作修改:
RestrictionsUtils.ilike("contactTelphone", userTel, MatchMode.ANYWHERE)即可
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kubete/archive/2009/09/30/4622049.aspx
特别说明:
criteria.add(Restrictions.or(Restrictions.eq("name", bean.getName()),
Restrictions.sqlRestriction("COOP_NAME like ? escape'/'", escapeSQLLike(bean.getName()+"_*"), Hibernate.STRING)));
sqlRestriction中要使用sql语句。
分享到:
相关推荐
hibernate3hibernate3hibernate3hibernate3hibernate3hibernate3hibernate3hibernate3
关于Hibernate3中文查询出错问题的解决,相信有不少朋友也遇过这种问题,希望对大家有所帮助
Hibernate提供的查询接口或其方法 hibernate综合查询解决方案
hibernate 用的较频繁的jar包,或者文档
Hibernate基本数据操作方法 java struts hibernate
使用hibernate封装方法,显现使用一个dao,service,impl来关联两个表的操作,实现,增删改查基本操作
hibernate延迟加载解决 延迟加载的具体解决方法
Hibernate操作数据库的方法.doc
hibernate annotation hibernate3
spring3 hibernate3 整合
hibernate3是目前比较稳定的一款持久层框架,该资源包括有hibernate3核心包、hibernate3依赖包、JDBC持久层驱动
hibernate3学习总结hibernate3学习总结hibernate3学习总结hibernate3学习总结
HIbernate3框架的依赖包。 使用说明:下载完成后,直接将解压缩后文件夹中的jar包引入到Eclipse中即可
Hibernate是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java...
Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQL...
hibernate3实例包hibernate3实例包hibernate3实例包
hibernate3必要jar包,多余的已经去掉,不够的已经不全,不多不少,刚刚合适,试验过了,成功!
hibernate3全部jar包:hibernate3.jar.zip 下载,保证好用
hibernate3.jar hibernate3.jar
压缩包内包含antlr-2.7.6.jar、commons-collections-3.1.jar、commons-logging-1.1.3.jar、dom4j-1.6.1.jar、ejb3-persistence.jar、hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、javassist-3.12.0.GA....