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>
它可以被视为一个对象化错误,或者至少它无法正确格式化和显示建议的复合索引。
当我尝试 运行 以下行时
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>
它可以被视为一个对象化错误,或者至少它无法正确格式化和显示建议的复合索引。