【问题标题】:JDO querys with OR in GAE在 GAME 中使用 OR 进行 JDO 查询
【发布时间】:2011-06-13 17:24:55
【问题描述】:

得到一个像这样的实体A

public class A
 private String a;
 private String b;
..
..
..

如何编写一个 JDO 查询来选择匹配关键字 ==a 或关键字 ==b 的所有 A 对象

完整的代码如下所示:

Query q = pm.newQuery(SELECT FROM A WHERE a == keyword || b == keyword ORDER BY date DESC");

        List<A> results = (List<A>)q.execute(keyword);

此代码没有给出任何错误,但没有给出任何结果。删除 ||部分给出结果。

谢谢

【问题讨论】:

    标签: google-app-engine jdo jdoql


    【解决方案1】:

    您不能对两个不同的字段执行 OR。这是来自docs的sn-p:

    在 JDOQL 字符串语法中,您可以 用 || 分隔多个过滤器 (逻辑“或”)和&&(逻辑“与”), 尽管请记住 ||只可以 当过滤它时使用 分隔都具有相同的字段 姓名。换句话说,||只是合法的 在过滤它的情况下 分离可以组合成一个 单个 contains() 过滤器:

    // legal, all filters separated by || are on the same field
    Query query = pm.newQuery(Employee.class,
                              "(lastName == 'Smith' || lastName == 'Jones')" +
                              " && firstName == 'Harold'");
    
    // not legal, filters separated by || are on different fields
    Query query = pm.newQuery(Employee.class,
                              "lastName == 'Smith' || firstName == 'Harold'");
    

    解决此问题的一种方法可能是将您的 a 和 b 存储在一个列表中。如果您有一个名为 foo 的项目列表,则可以在 foo = 关键字的地方进行查询,如果 foo 中的任何项目匹配,您将在结果中返回该对象。您对 a 和 b 是什么没有说太多,所以我不知道这是否适合您:)

    更新

    public class Example {
        String firstName;
        String lastName;
        List<String> allNames;
    
        public Example(String first, String last){
            firstName = first;
            lastName = last;
            allNames = new ArrayList<String>();
            allNames.add(first);
            allNames.add(last);
        }
     }
    

    有了类似的东西,您就可以查询 "allNames == 'Smith' || allNames=='Jones'"。

    【讨论】:

    • 您好,感谢您的评论。我不确定我是否关注该列表,a 和 b 是字符串,我想要匹配的关键字也是如此。我想完全按照非法示例进行操作,您的解决方案是否可行,看起来如何?
    • 我在回答中添加了一个示例。
    猜你喜欢
    • 2019-04-04
    • 2022-10-04
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多