2017-01-31 12 views
0

Когда я пытаюсь запустить следующую строкуобъективизации DatastoreNeedIndexException ошибка Заказать

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

Я получаю следующее сообщение об ошибке:

«com.google.appengine.api.datastore.DatastoreNeedIndexException: нет Соответствующий индекс найден. Рекомендуемый индекс: \ n- kind: MessageEntity \ n ancestor: yes \ n Свойства: \ n - name: dateSent \ n \ nНаложенный индекс для этого запроса: \ n \ n \ n \ n \ n "

Если я удаляю строку .order("dateSent"), она отлично работает и приносит мне все соответствующие объекты в хранилище данных.

любая идея, что я могу делать неправильно?

вот мой Entity Класс

@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 перед созданием сущностей, и при поиске этой ошибки я видел это как общую ошибку.

ответ

2

Сообщение об ошибке указывает отсутствующий составной индекс.

@Index используется для аннотирования одинарного свойства индексирует только композитных индексов по-прежнему необходимо определить в datastore-indexes.xml см Creating a Composite Index for AppEngine in Android-Studio-based project

То, что я подозреваю, происхожу то, что сам предок запрос уже использует индекс (для предка), поэтому, даже если вы добавляете в свой запрос одно свойство - .order("dateSent") - он больше не является единственным индексом и требует составного индекса. Вот почему он отлично работает без сортировки. И это будет хорошо работать с сортировкой, но если это не будет запрос предка.

Исходя из содержания предложенной в сообщении об ошибке Вы должны были бы этот индекс в вашем datastore-indexes.xml:

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

Это, наверное, может рассматриваться как объективизации ошибка, или, по крайней мере, его неспособность правильно форматировать и дисплей предлагаемый составной индекс.