2013-10-10 3 views
0

Я довольно новичок в appEnginy и объективирую. Однако мне нужно получить одну строку из db, чтобы получить от нее некоторое значение. Я попытался извлечь элемент по ofy().load().type(Branch.class).filter("parent_branch_id", 0).first(), но результат FirstRef(null). Однако, когда я запускаю следующий цикл:GoogleAppEngine - запрос с каким-то настраиваемым фильтром

for(Branch b : ofy().load().type(Branch.class).list()) { 
    System.out.println(b.id +". "+b.tree_label+" - parent is " +b.parent_branch_id); 
}; 

Что делать неправильно?

Ofcourse Branch - это объект базы данных, если он имеет значение parent_branch_id имеет тип long.

+0

Какой результат вы получите с петлей? – CMDej

+0

Результат - это всего лишь список ветвей (ну, собственно, узлов дерева), сформированных в соответствии с system.out.println: '[long] [node_name] - parent is [long]' – Moby04

+0

Есть ли у вас родители с id 0? Что это за идентификатор? Автоиды от Objecitfy? Потому что в этом случае я думаю, что вы не можете получить 0 id ... – CMDej

ответ

1

Если вы хотите Branch как результат вашего запроса, я думаю, что вы пропустите .now():
Branch branch = ofy().load().type(Branch.class).filter("parent_branch_id", 0).first().now();

+0

Но Netbeans подчеркивает это как ошибку, когда я добавляю сейчас ... – Moby04

+0

Какая ошибка вы получаете от Netbeans? – CMDej

+0

'не могу найти символ символ: now() местоположение: класс Ref ' – Moby04

0

Похоже, вы не имеете @Index аннотацию на вашем parent_branch_id собственности. Когда вы делаете ofy().load().type(Branch.class).list(), Objectify эффективно выполняет пакетную сортировку по типу (например, делает Query("Branch") с низкоуровневым API), поэтому ему не нужны индексы свойств. Как только вы добавите filter(), он использует запрос.

Предполагая, что вы используете Objectify 4, свойства не индексируются по умолчанию. Вы можете индексировать все свойства в своей сущности, добавив в класс аннотацию @Index. annotation reference предоставляет полезную информацию.

+0

Не помогло, но спасибо. – Moby04

+0

@ Moby04 Если вместо 'first()' вы используете 'list()', но сохраняя 'filter()', вы получаете ожидаемые результаты? – tx802

0

Пример из Objectify API reference:

LoadResult<Thing> th = ofy.load().type(Thing.class).filter("foo", foo).first(); 
Thing th =  ofy.load().type(Thing.class).filter("foo", foo).first().now(); 

Таким образом, вы должны убедиться, что член «Foo» имеет @Index и использовать сейчас() для получения первого элемента. Это вернет null, если элемент не найден.

Может быть "parent_branch_id" в вашем случае это долго, в этом случае значение должно быть 0L, а не 0.

Смежные вопросы