【问题标题】:Objectify filter does not return the expected resultsObjectify 过滤器不返回预期结果
【发布时间】:2014-03-20 12:29:22
【问题描述】:

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

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

我需要根据 expired 字段过滤数据,因此我必须更改实体以使归档过期现在被索引。修改后的实体如下:

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

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

列:数据

id : 1

过期:是的

id : 2

过期:假

id : 3

过期:假

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

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

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

id : 4

过期:假

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

【问题讨论】:

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


    【解决方案1】:

    没有返回现有实体的原因是因为在您修改实体类后它们没有被索引。Objectify 文档指出:

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

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

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

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

    【讨论】:

    • 您好,感谢您提供的信息。顺便说一句,当我们说重新保存时,我们是否需要删除现有实体并再次保存?或者一个简单的更新确实有效?顺便说一句,有没有办法使用 GAE 的任何 GAE 仪表板/自动脚本自动重复?
    • 只需重新保存实体作品。为此,您可以使用 GAE map/reduce 框架,但您必须编写少量代码。
    • 无需删除现有实体,您只需从数据存储中读取实体并在实体上调用保存即可。我会更新答案。很高兴我能帮上忙。
    • 只是出于好奇 - GAE 不应该根据需要处理这个 RE-PERSIST 吗?例如在 GAE 仪表板本身上提供一个选项,这将简化开发人员的工作 [当然,我们可以确保将应用程序保持在维护模式,直到重新持久化/重新构建索引结束]?
    猜你喜欢
    • 2021-07-11
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多