使用Hibernate进行不区分大小写的search

我正在使用Hibernate将Java应用程序的ORM应用到Oracle数据库(不是数据库供应商很重要,我们可能有一天会切换到另一个数据库),我想根据用户提供的string从数据库中检索对象。 例如,在search人时,如果用户正在寻找居住在“fran”的人,我希望能够在旧金山给她的人。

SQL不是我的强项,我更喜欢Hibernate的Criteria构build代码来硬编码string。 任何人都可以在正确的方向上指出我如何在代码中做到这一点,如果不可能,硬编码SQL应该是什么样子?

谢谢,

Yuval = 8-)

对于您描述的简单情况,请查看Restrictions.ilike(),它会进行不区分大小写的search。

 Criteria crit = session.createCriteria(Person.class); crit.add(Restrictions.ilike('town', '%fran%'); List results = crit.list(); 
 Criteria crit = session.createCriteria(Person.class); crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE); List results = crit.list(); 

如果您使用Spring的HibernateTemplate与Hibernate进行交互,那么您将如何对用户的电子邮件地址执行不区分大小写的search:

 getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase()); 

您也不必input“%”通配符。 您可以传递MatchMode ( 此处为以前版本的文档 )来告诉search如何performance。 START ,任何地方, EXACTEND匹配是选项。

忽略大小写的常用方法是将数据库值和input值都转换为大写或小写 – 生成的sql会有类似

 select f.name from f where TO_UPPER(f.name) like '%FRAN%' 

在hibernate标准中,如(…)。ignoreCase()

我对Nhibernate更熟悉,所以语法可能不是100%准确的

有关更多信息,请参阅hibernate 3提取和hibernate文档15.2。 缩小结果集

大多数默认数据库sorting规则不区分大小写,但在SQL Server环境中,可以在实例,数据库和列级别进行设置。

你可以看看使用罗盘上面的lucene包装。

http://www.compass-project.org/

通过添加一些注释到你的域对象,你可以实现这种事情。

Compass为使用Lucene提供了一个简单的API。 如果您知道如何使用ORM,那么只需简单的保存,删除和查询操作即可使用Compass。

从网站本身。 “在Lucene的基础上,Compass简化了Lucene的常见使用模式,如谷歌风格的search,索引更新以及caching和索引分片(子索引)等更高级的概念,Compass还为并发提交和内置优化合并“。

我以前用过这个,我觉得它很棒。

这也可以使用org.hibernate.criterion包中的标准Example完成。

 public List findLike(Object entity, MatchMode matchMode) { Example example = Example.create(entity); example.enableLike(matchMode); example.ignoreCase(); return getSession().createCriteria(entity.getClass()).add( example).list(); } 

只是另一种方式,我觉得有用的完成上述。