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'".