当我尝试运行以下行时
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注释,在搜索此错误时,我将此视为常见错误。
答案 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>
它可以被视为一个客观化的错误,或者至少它无法正确格式化和显示建议的复合索引。