Objectify - Как фильтровать по логическому? - PullRequest
2 голосов
/ 27 августа 2010

Я ударил стену, используя Objectify для хранилища данных Google Appengine при фильтрации по логическим значениям. Это примерно то, что я:

class Task implements Serializable {
 ... 
 boolean failed;
 ...
}

Независимо от того, что я делаю, когда я ищу, я всегда получаю пустой ответ, хотя в БД есть объекты с failed = false

Примеры:

ofy().query(Task.class).filter("failed",false).list()
ofy().query(Task.class).filter("failed",Boolean.FALSE).list()
ofy().query(Task.class).filter("failed",0).list()
ofy().query(Task.class).filter("failed","false").list()
ofy().query(Task.class).filter("failed","FALSE").list()

Ответы [ 2 ]

6 голосов
/ 06 ноября 2010

Я нашел этот старый вопрос, пока гуглил и хотел его прояснить.

Вы должны иметь возможность выполнять запросы по логическим полям, если они проиндексированы в момент их ввода в хранилище данных. Вот полный модульный тест с использованием Objectify и библиотеки модульных тестов App Engine. Следующий тест проходит. Так что проблема кроется в другом месте, и я предлагаю вам использовать юнит-тесты, чтобы обнаружить ее.

import static org.junit.Assert.*;

import javax.persistence.Id;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.appengine.api.datastore.QueryResultIterator;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;
import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.ObjectifyService;
import com.googlecode.objectify.Query;

class FakeEntity {
  @Id public Long id;
  public boolean boolProp;
  public boolean equals(Object other) {
    return other != null &&
           other instanceof FakeEntity &&
           ((FakeEntity)other).id == this.id &&
           ((FakeEntity)other).boolProp == this.boolProp; 
  }
}

public class FakeEntityTest {
  private final LocalServiceTestHelper helper =
    new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());
  @Before
  public void setUp() {
    helper.setUp();
  }
  @After
  public void tearDown() {
    helper.tearDown();
  }

  @Test
  public void testBoolQuery() {
    ObjectifyFactory objectifyFactory = ObjectifyService.factory();
    objectifyFactory.register(FakeEntity.class);
    Objectify objectify = objectifyFactory.begin();
    FakeEntity entityFalse = new FakeEntity();
    FakeEntity entityTrue = new FakeEntity();
    entityTrue.boolProp = true;
    objectifyFactory.begin().put(entityFalse);
    objectifyFactory.begin().put(entityTrue);

    assertArrayEquals(
        new FakeEntity[] {entityFalse},
        objectify.query(FakeEntity.class)
        .filter("boolProp", false).list().toArray());
    assertArrayEquals(
        new FakeEntity[] {entityTrue},
        objectify.query(FakeEntity.class)
        .filter("boolProp", true).list().toArray());
    assertArrayEquals(
        new FakeEntity[] {entityTrue},
        objectify.query(FakeEntity.class)
        .filter("boolProp", true).list().toArray());
    assertArrayEquals(
        new FakeEntity[] {entityTrue},
        objectify.query(FakeEntity.class)
        .filter("boolProp", Boolean.TRUE).list().toArray());
    // Filtering on integers and strings WON'T work:
    assertArrayEquals(
        new FakeEntity[] {},
        objectify.query(FakeEntity.class)
        .filter("boolProp", "true").list().toArray());
    assertArrayEquals(
        new FakeEntity[] {},
        objectify.query(FakeEntity.class)
        .filter("boolProp", 0).list().toArray());
  }
}
4 голосов
/ 12 ноября 2014

Вы не проиндексировали логическое несостоявшееся свойство.

Если поле не проиндексировано, фильтр не будет работать в хранилище данных objectify.

Поэтому, чтобы оно заработало, добавьте

@Index boolean failed;

Теперь ваш фильтр будет работать.

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

Надеюсь, это поможет.

...