JDO запрашивает OR в GAE

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

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

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

Решение

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

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

Другие вопросы по тегам