不知道大家有没有碰到,还是没有这种需求。就是用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语句。
分享到:
相关推荐
Hibernate3 是一个强大的Java持久...理解并熟练掌握Hibernate3的核心概念和使用方法,对于任何Java开发者来说都是必要的技能。在实际项目中,正确配置和使用Hibernate,可以有效地实现数据的持久化,同时降低维护成本。
Hibernate3 是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发人员可以更加专注于业务逻辑而不是数据库的细节。这个`hibernate3.zip`压缩包包含了`hibernate3.jar`,它是Hibernate 3版本的核心库,包含...
Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。这个“hibernate3全部jar包:hibernate3.jar.zip”包含了所有必要的库文件,方便用户一次性下载并...
1. **Hibernate3简介**:Hibernate3是Hibernate项目的第三个主要版本,它提供了一种对象关系映射(ORM)解决方案,允许开发人员使用面向对象的编程模型来处理关系数据库。它的目标是减少数据库访问的复杂性,提高...
Hibernate3是一个广泛使用的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作,极大地简化了Java应用程序与数据库之间的交互。在这个"Hibernate3的依赖包"中,包含了运行Hibernate3应用...
以上就是解决Hibernate3中文查询出错问题的主要步骤。在实际操作中,还需要根据具体的错误信息和环境进行排查,可能需要调整的配置不止一处。记得每次修改配置后都要重新运行测试,以确认问题是否已得到解决。希望...
Spring3和Hibernate3的整合是企业级Java应用开发中的常见实践,旨在提供一个高效、灵活且可维护的解决方案。下面将详细阐述这两个框架的基本概念以及整合过程中的关键知识点。 Spring是一个全面的后端开发框架,它...
Hibernate3是中国Java开发社区中广泛使用的持久层框架之一,它为开发者提供了强大的对象关系映射(ORM)功能,简化了数据库操作。这个“hibernate3所需JAR包”包含了所有必要的组件,使得开发者能够在项目中顺利集成...
Hibernate基本数据操作方法 java struts hibernate
《基于Hibernate3、STS与MySQL的用户管理系统详解》 在软件开发领域,持久化层的管理是关键一环,Hibernate3作为一个优秀的Java对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨如何利用Hibernate...
标题和描述中提到的关键信息是“hibernate3”、“依赖包”和“JDBC”。这表明我们将讨论关于Hibernate ORM框架的第三版,它所需的依赖库,以及与Java数据库连接(JDBC)的关系。Hibernate是一个流行的Java持久化框架...
标题提及的是“hibernate3实例包”,这表明我们将讨论的是关于Hibernate 3的一个实例集合,Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转换为对对象的操作,从而简化了Java应用...
以下是关于Hibernate3及其所需jar包的相关知识点: 1. **对象关系映射(ORM)**:ORM是一种编程技术,它将关系数据库的数据映射到对象模型上,使得开发者可以使用面向对象的方式来处理数据库。Hibernate作为ORM工具...
Hibernate3是一款著名的Java持久化框架,它为Java开发者提供了一种高效、便捷的方式来操作数据库,大大简化了在Java应用中处理数据库的工作。与传统的JDBC(Java Database Connectivity)相比,Hibernate提供了一种...
Java Hibernate3 是一个强大的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。在Java Hibernate3中,添加和删除数据是通过持久化类和配置文件实现的,无需直接编写SQL语句。以下是关于这...
### 关于《Apress - Pro Hibernate3》的知识点解析 #### 一、书籍基本信息与背景 - **书名**:《Pro Hibernate3》 - **作者**:Dave Minter 和 Jeff Linwood - **出版社**:Apress - **出版年份**:2005年 - **...
Hibernate3是一个流行的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与业务对象进行解耦,简化了数据库应用程序的开发。这个"hibernate3 jar包"包含了所有必要的组件,使得开发者可以在项目中直接引用,...
【标题】:“Hibernate3框架系列 [ 1 ]” 在这一系列的文章中,我们将深入探讨Java领域中的著名对象关系映射(ORM)框架——Hibernate3。ORM框架的主要目标是通过提供一种编程模型,使得开发人员可以使用面向对象的...
**Hibernate3jar包详解** Hibernate 是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。Hibernate3是其第三个主要版本,发布于2006年,相较于之前的版本,它引入了许多增强功能和...