使用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
,任何地方, EXACT
和END
匹配是选项。
忽略大小写的常用方法是将数据库值和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(); }
只是另一种方式,我觉得有用的完成上述。