在订单上对对象进行数据描述的DatastoreNeedIndexException错误

时间:2017-01-31 19:02:08

标签: java google-app-engine objectify

当我尝试运行以下行时

List<MessageEntity> list = 
                   ObjectifyService.ofy()
                       .load()
                       .type(MessageEntity.class)
                       .ancestor(Key.create(groupKey))
                       .order("dateSent")
                       .list();

我收到以下错误消息:

  

&#34; com.google.appengine.api.datastore.DatastoreNeedIndexException:找不到匹配的索引。建议索引是:\ n- kind:MessageEntity \ n ancestor:yes \ n properties:\ n - name:dateSent \ n \ n此查询的建议索引是:\ n \ n \ n \ n \ n&#34; < / p>

如果我删除了.order("dateSent")行,它可以正常工作,并将数据存储区中的所有相应实体带给我。

任何想法我可能做错了什么?

这是我的实体类

@Entity
public class MessageEntity implements EntityRoot {


@Parent
private Ref<GroupEntity> groupEntityRef;
@Id
private Long id;


private String message;
private String attachmentUrl;
private Ref<TenantUserEntity> sender;

@Index
private Long dateSent;

public MessageEntity(Ref<GroupEntity> groupEntityRef, String message, String attachmentUrl,
                     Ref<TenantUserEntity> sender, Long dateSent) {
    this.groupEntityRef = groupEntityRef;
    this.message = message;
    this.attachmentUrl = attachmentUrl;
    this.sender = sender;
    this.dateSent = dateSent;
}

public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public String getAttachmentUrl() {
    return attachmentUrl;
}

public void setAttachmentUrl(String attachmentUrl) {
    this.attachmentUrl = attachmentUrl;
}

public Ref<TenantUserEntity> getSender() {
    return sender;
}

public void setSender(Ref<TenantUserEntity> sender) {
    this.sender = sender;
}

public Long getDateSent() {
    return dateSent;
}

public void setDateSent(Long dateSent) {
    this.dateSent = dateSent;
}

public Ref<GroupEntity> getGroupEntityRef() {
    return groupEntityRef;
}

@EmptyConstructor
public MessageEntity() {
}


@Override
public Key<? extends EntityRoot> getKey() {
    return Key.create(groupEntityRef.getKey(), MessageEntity.class, id);
}

}

P.S。我在创建实体之前添加了@Index注释,在搜索此错误时,我将此视为常见错误。

1 个答案:

答案 0 :(得分:2)

错误消息表示缺少复合索引。

@Index仅用于注释单一属性索引,复合索引仍需要在datastore-indexes.xml中定义,请参阅{{3} }

我怀疑发生的事情是祖先查询本身已经使用了索引(对于祖先),所以即使你在查询中添加了一个属性 - .order("dateSent") - 它也不是单个索引查询的时间越长,并且需要复合索引。这就是为什么没有排序就能正常工作的原因。它可以很好地进行排序,但如果它不是一个祖先查询。

根据错误消息中建议的内容,您需要datastore-indexes.xml中的此索引:

    <datastore-index kind=\"MessageEntity\" ancestor=\"true\" source=\"manual\">
        <property name=\"dateSent\" direction=\"asc\"/>
    </datastore-index>

它可以被视为一个客观化的错误,或者至少它无法正确格式化和显示建议的复合索引。