2010-07-30 130 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