【问题标题】:Ignore case in JDO query在 JDO 查询中忽略大小写
【发布时间】:2011-03-23 02:53:52
【问题描述】:

我想从数据库中选择一个结果列表,但是用于 JDO 查询的 == 运算符区分大小写。有没有办法使用单个参数从表中选择“USER”、“user”和“User”?

在 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);

【问题讨论】:

    标签: java google-app-engine jdo datanucleus


    【解决方案1】:

    您需要以不区分大小写的方式存储字段的副本 - 例如,小写,但如果“排序大小写”可用,则更好。然后,查询那个。

    原因是没有办法以“不区分大小写”的方式有效地搜索常规索引。

    【讨论】:

    • 哇,真的吗?这听起来像是一个低效且容易出错的解决方案。我在jpox.org/docs/1_2/jdo/jdoql_methods.html 上找到了toLowerCase() 方法,所以我可以查询toLowerCase(username) == toLowerCase(usernameParam)。这似乎有点低效且不是很优雅,但它可能会起作用。
    • 这与低效完全相反。将数据库中的每个条目与您的查询进行比较,这是您在问题中提到的任何一种方法都会做的,效率低下。出于同样的原因,该字段上的 toLowerCase() 将不起作用。
    • 这是否意味着如果我必须让一些以区分大小写的方式存储的文本可以以不区分大小写的方式进行搜索,那么现在在应用引擎中唯一的方法是创建另一个字段并复制给定文本 .toLowerCase?
    • @JohnIdol 没错。您可以使用计算域为您执行此操作。
    • @JohnIdol 全文搜索 API 会为您进行规范化和词干提取等操作,因此您无需自己动手。
    【解决方案2】:

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

    【讨论】:

    • 在应用程序引擎中,我得到“不支持的数据存储功能”:(
    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多