在GAME中使用OR进行JDO查询

时间:2011-01-22 16:10:11

标签: google-app-engine jdo jdoql

有一个像这样的实体A

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

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

完整代码看起来像这样:

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

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

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

由于

1 个答案:

答案 0 :(得分:2)

您不能在两个不同的字段上执行OR。以下是docs

的摘录
  

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

// 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 = keyword的查询,如果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'”。