JDO запрашивает OR в GAE - PullRequest
0 голосов
/ 22 января 2011

Получил объект A с таким

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

Как написать запрос JDO, который выбирает все объекты A, которые соответствуют любому ключевому слову == ключевое слово OR == 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 Ответ

2 голосов
/ 23 января 2011

Вы не можете сделать ИЛИ в двух разных полях.Вот фрагмент из документов :

В строковом синтаксисе 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'".

...