使用多个filter()查询时,Objectify不会返回数据,即使相应的属性设置为多索引也是如此

时间:2014-04-20 11:24:08

标签: google-cloud-datastore objectify

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

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

我需要根据subId过滤数据,过期声明的字段,所以我使用datastore-indexes.xml创建了一个多索引,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes autoGenerate="true">
<datastore-index kind=“Data” ancestor="false">
    <property name=“subId” direction="asc" />
    <property name="expired" direction="asc" />
    <property name="claimed" direction="asc" />
</datastore-index>
</datastore-indexes>

此实体完全是一个新实体,以下是添加到实体类型中的两个新记录:

Column : Data

id : 1
subId : 1
expired : false
claimed : false

id : 2
subId : 1
expired : false
claimed : false

然而,当我尝试使用以下逻辑查询数据实体时,我确实得到空数据:

List<Data> data = ofy.load().type( Data.class )
    .filter( "subId = ", 1 )
    .filter( "expired = ", Boolean.FALSE )
    .filter( "claimed = ", Boolean.FALSE )
    .list();

PS - 我看到索引状态当前是Serving和I,除了要正确检索的数据。如果我遗漏了什么请帮帮我?

1 个答案:

答案 0 :(得分:6)

为了使实体显示在多属性索引中,必须为该实体中的每个字段编制索引。将@Index放在三个字段上并重新保存实体。

@Index放在id字段上没有效果,顺便说一下。 Id / parent字段不是真正的属性,它们只是密钥的一部分 - 它总是被索引。