代码之家  ›  专栏  ›  技术社区  ›  Siva Reddy Vippala

Objectify筛选器未返回预期结果

  •  1
  • Siva Reddy Vippala  · 技术社区  · 12 年前

    我有一个现有的数据存储实体,如下所示:

    @Data
    @Entity
    public class Data
    {
        @Id @Index long id;
        boolean expired;
    }
    

    我需要根据 期满 字段,因此我必须更改实体,使该字段现在已过期。修改后的实体如下:

    @Data
    @Entity
    public class Data
    {
        @Id @Index long id;
        @Index boolean expired;
    }
    

    以下是创建索引之前数据存储中的现有数据:

    列:数据

    编号:1

    过期:true

    编号:2

    过期:false

    编号:3

    过期:false

    我的意图是使用objectify获取数据,并在过期时使用过滤器,因此我修改了代码以使用以下objectify查询:

    return (List<Data>) ofy.load().type( Data.class ).filter( "expired = ", false ).list();
    

    它应该返回两条记录,但它没有返回任何内容。 顺便说一下,在创建索引后,我向实体中添加了一条新记录,如下所示

    编号:4

    过期:false

    如果我返回查询,我现在看到一个结果,那就是id=4。过滤器似乎只适用于新添加的记录,索引力适用于所有旧记录?如何解决这个问题?

    1 回复  |  直到 12 年前
        1
  •  3
  •   elcid    12 年前

    未返回现有实体的原因是,自您修改实体类以来,尚未对其进行索引。Objectify文档指出:

    保存实体时会创建/更新单个属性索引。

    要使现有的实体实例显示在查询中,您必须重新保存它们,这将迫使数据存储创建索引。

    您必须为每个现有实体执行以下操作:

    1. 从数据存储中检索(加载)现有实体
    2. 将现有实体写入(保存)回数据存储