2008-09-23 52 views
46

我正在使用Hibernate將Java應用程序的ORM應用到Oracle數據庫(不是數據庫供應商很重要,我們可能有一天會切換到另一個數據庫),而且我想從數據庫根據用戶提供的字符串。例如,當搜索人時,如果用戶正在尋找居住在「fran」中的人,我希望能夠在舊金山給她的人。使用Hibernate進行不區分大小寫的搜索

SQL並不是我的強項,我更喜歡Hibernate的Criteria構建代碼來硬編碼的字符串。任何人都可以在正確的方向上指出我如何在代碼中做到這一點,如果不可能,硬編碼SQL應該是什麼樣子?

感謝,

尤瓦= 8-)

回答

67

對於您描述的簡單情況,請查看Restrictions.ilike(),它會進行不區分大小寫的搜索。

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

謝謝......不知道ilike存在於Hibernate = 8-) – Yuval 2008-09-23 12:51:29

0

大多數默認的數據庫排序規則是不區分大小寫,但在SQL Server的世界可以在實例,數據庫和列級設置。

0

你可以看看在lucene上面使用Compass的包裝。

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

通過添加一些註釋你的域對象你達到這種事情。

羅盤爲Lucene提供了一個簡單的API。如果您知道如何使用ORM,那麼您將會感到賓至如歸,使用簡單的操作進行保存,並刪除&查詢。

從網站本身。 「在Lucene的基礎上,Compass簡化了Lucene的常見使用模式,比如谷歌風格的搜索,索引更新以及更高級的概念,比如緩存和索引分片(子索引),Compass還爲併發提交使用內置優化併合並。「

我以前用過這個,我覺得它很棒。

3

通常的方法,以忽略的情況是這兩個數據庫中的值和輸入值轉換爲大寫或小寫 - 所得SQL將具有類似

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

在休眠標準restrictions.like(.. )。IGNORECASE()

我更熟悉與NHibernate因此更多的一些信息的語法可能不是100%準確

看到pro hibernate 3 extract和​​

+0

對於休眠版本3.6.1,縮小結果集的部分是17.2。 [鏈接](http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#querycriteria-narrowing) – zmf 2011-02-16 22:53:07

+0

先生,這兩個鏈接都是無效的。 – 2013-10-11 09:05:26

9

如果你使用Spring的HibernateTemplate來與Hibernate交互,這裏是你會怎麼做一個區分大小寫的搜索對用戶的電子郵件地址:

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase()); 
36
Criteria crit = session.createCriteria(Person.class); 
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE); 
List results = crit.list(); 
0

這也可以使用標準實例來完成,在org.hibernate.criterion包中。

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(); 
} 

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