Objectify过滤器不返回预期结果

时间:2014-03-20 12:29:23

标签: google-app-engine google-cloud-datastore objectify

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

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

我需要根据过期的字段过滤数据,因此我必须更改实体以使文件已过期,现在已编入索引。修改后的实体如下:

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

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

列:数据

id:1

已过期:真实

id:2

已过期:false

id:3

已过期:false

我的意图是使用objectify获取过期的过滤器数据,所以我修改了我的代码以使用下面的客观化查询:

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

它应该返回两个记录,但它什么都不返回。 顺便说一句,在创建索引之后,我在实体中添加了一条新记录,如下所示

id:4

已过期:false

如果我回询,我现在看到一个结果,并且id = 4.似乎过滤器仅适用于新添加的记录,索引dint适用于所有旧记录?如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

未返回现有实体的原因是因为您修改了实体类后尚未编制索引.Objectify文档指出:

  

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

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

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

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