2

Я ударил стену, используя Objectify для хранилища данных google appengine, при фильтрации по булевым значениям. Это примерно то, что я не имею:Objectify - Как фильтровать по логическим?

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() 

ответ

6

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

Вы должны иметь возможность запрашивать логические поля, если они индексируются в то время, когда они вошли в хранилище данных. Вот полный модульный тест с использованием тестовой библиотеки Objectify и App Engine (для ее запуска вам необходимо установить ссылку в the unit test jar described here). Проходит следующий тест. Поэтому проблема кроется в другом месте, и я предлагаю вам использовать модульные тесты, чтобы обнаружить это.

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()); 
    } 
} 
+0

примечание: IDE предлагает создать отсутствующий FakeEntity # hashCode() – mjn

4

Вы не указали свойство с булевым именем.

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

Итак, чтобы сделать его работу, добавить

@Index boolean failed; 

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

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

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

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