Фильтр запроса objectify по списку в сущности содержит параметр поиска - PullRequest
7 голосов
/ 26 марта 2012

в приложении у меня есть объект, который содержит список других объектов (скажем, событие, содержащее список назначенных сотрудников)

с использованием objectify - мне нужно найти все события, которым назначен конкретный сотрудник.

существует ли основной способ фильтрации запроса, если он содержит параметр - вид, противоположный запросу в

... быстрый псевдокод

findAll(Employee employee) {
  ...
  return ofy.query(Event.class).filter("employees.contains", employee).list();
}

любая помощь будет принята с благодарностью


Я попытался просто выполнить фильтр ("работники", сотрудник), увидев это http://groups.google.com/group/objectify-appengine/browse_thread/thread/77ba676192c08e20 - но, к сожалению, это возвращает мне пустой список

В настоящее время я делаю что-то действительно неэффективное - прохожу каждое событие, перебираю сотрудников и добавляю их в новый список, если он содержит данного сотрудника, просто для того, чтобы иметь что-то, что работает - хотя я знаю, что это неправильно


позвольте мне добавить одну вещь,

вышеприведенный запрос на самом деле не тот, который есть, я просто использовал его, потому что не думал, что это изменит ситуацию.

Сотрудник и события находятся в одной группе лиц с бизнесом как родитель

фактический запрос, который я использую, выглядит следующим образом

ofy.query(Event.class).ancestor(businessKey).filter("employees", employee).list();

к сожалению, это все еще возвращает пустой список - портит ли его предок (ключ) фильтр?


решение, поле сотрудников было неправильно проиндексировано.

Я добавил файл datastore-indexes для создания составного индекса, но первоначально тестировал значение, которое я добавил до индексации поля сотрудников, это было что-то глупое, что я делал - просто имел индекс для «бизнеса» поле и поле "сотрудники" исправили все. файл datastore-indexes не был необходим, после удаления и повторной попытки все работало нормально.

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Как правило, вы делаете это одним из двух способов:

Put a property of Set<Key<Employee>> on the Event

или

Put a property of Set<Key<Event>> on the Employee

Вы также можете создать объект отношения, но если вы просто выполняете фильтрацию значений с относительно низким числом, обычно проще просто установить свойство set для одного объекта или другого.

Затем отфильтруйте, как вы описываете:

ofy.query(Event.class).filter("employees", employee).list()

или

ofy.query(Employee.class).filter("events", event).list()

Свойство list должно содержать ключи к целевому объекту. Если вы передадите сущность методу filter (), Objectify поймет, что вы хотите фильтровать по ключу.

0 голосов
/ 21 июля 2017

Пример: / ************************************************* ** /

@ Entity

@ Cache

Новости публичного класса {

@Id Long id;
String news ;
@Index List<Long> friend_list = new ArrayList<Long>();

// Мои друзья, которые могут видеть мои новости, exemele: friend_list.add (id_f1); friend_list.add (id_f2); friend_list.add (id_f3);

// Чтобы сделать операцию с "friend_list", обязательно ее проиндексировать

}

/ ********************************************** *** /

публичные новости (Long id_f) {

    List<Long> friend_id = new ArrayList<Long>();
    friend_id.add(id_f);

Query<Nesw> query = ofy().load().type(News.class).filter("friend_list in",friend_id).limit(limit); 

// Чтобы отфильтровать список, сразу после имени поля, которое вы хотите отфильтровать, добавьте «IN».

// здесь ==> .filter ("список_приемников", идентификатор_друга);

// если список друзей содержит "id_friend" ==> возвращаемое значение запроса

    .........

}

...