Objectify DatastoreNeedIndexException 订单错误

Objectify DatastoreNeedIndexException error on Order

当我尝试 运行 以下行时

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

我收到以下错误消息:

"com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found. recommended index is:\n- kind: MessageEntity\n ancestor: yes\n properties:\n - name: dateSent\n\nThe suggested index for this query is:\n \n \n \n\n"

如果我删除 .order("dateSent") 行,它会正常工作并为我带来数据存储区中的所有对应实体。

知道我做错了什么吗?

这是我的实体 Class

@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 注释,在搜索此错误时我将其视为常见错误。

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

@Index仅用于注解single-property索引,复合索引仍需定义在datastore-indexes.xml,参见

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

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

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

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