2010-07-30 181 views
3

我想從數據庫中選擇結果列表,但用於JDO查詢的==運算符區分大小寫。有沒有辦法使用單個參數從表中選擇「USER」,「user」和「User」?忽略JDO查詢中的大小寫

在MySQL中,您有LIKE運算符,並且在Java中有equalsIgnoreCase函數。但是,在這個例子中他們都沒有工作。

PersistenceManager pm = JDO.factory.getPersistenceManager(); 

Query query = pm.newQuery(User.class, "username == usernameParam"); 
query.declareParameters("String usernameParam"); 

List<User> results = (List<User>) query.execute(username); 

回答

4

JDOQL有一些可用的字符串方法。檢查文檔here

解決您的問題,你可以做到以下幾點:

PersistenceManager pm = JDO.factory.getPersistenceManager(); 

Query query = pm.newQuery(User.class, "username.toUpperCase() == usernameParam"); 
query.declareParameters("String usernameParam"); 

List<User> results = (List<User>) query.execute(username.toUpperCase()); 
+0

在應用程序引擎中,我得到了「不受支持的數據存儲功能」 – JohnIdol 2012-05-24 19:40:51

5

您需要在現場的副本存儲在不區分大小寫的方式 - 低的情況下,例如,雖然「整理」爲,如果它是可用的更好。然後,查詢。

原因是沒有辦法以'不區分大小寫'的方式有效地搜索常規索引。

+0

哇,真的嗎?這聽起來像是一種效率低下且容易出錯的解決方案。我在http://www.jpox.org/docs/1_2/jdo/jdoql_methods.html上找到了toLowerCase()方法,所以我可以查詢'toLowerCase(username)== toLowerCase(usernameParam)'。這看起來有點低效,不是很優雅,但它可能工作。 – Vortico 2010-07-30 14:54:25

+2

這與效率低下完全相反。將數據庫中的每個條目與您的查詢進行比較,這是您在問題中提到的任何一種方法都會執行的操作,效率不高。字段上的toLowerCase()不會出於同樣的原因。 – 2010-07-30 15:15:46

+0

這是否意味着如果我必須以區分大小寫的方式將某些文本以區分大小寫的方式進行搜索,那麼現在在app-engine中唯一的方法是創建另一個字段並複製給定的文本.toLowerCase? – JohnIdol 2012-05-24 19:54:51