J'ai certaines entités sur lesquelles je souhaite faire une requête ancêtre et filtrer un paramètre par l'opérateur ">". L'entité en question hérite d'un autre objet (je ne pense pas que cela devrait avoir de l'importance). Voici mes classes d'entités:Requête Appengine ne renvoyant aucun index correspondant - Objectify
@Indexed
public class ValidatedObject {
public Long timeCreated=System.currentTimeMillis();
public Long timeUpdated=System.currentTimeMillis();
public Long getTimeUpdated() {
return timeUpdated;
}
public void setTimeUpdated(Long timeUpdated) {
this.timeUpdated = timeUpdated;
}
public Boolean validated=false;
@Unindexed
public String validatedID;
@Unindexed
private Long validatedTime;
@Unindexed
private String creatorID;
public Long getTimeCreated() {
return timeCreated;
}
public void setTimeCreated(Long timeCreated) {
this.timeCreated = timeCreated;
}
public boolean isValidated() {
return validated;
}
public void setValidated(boolean validated) {
this.validated = validated;
}
public String getValidatedID() {
return validatedID;
}
public void setValidatedID(String validatedID) {
this.validatedID = validatedID;
}
public Long getValidatedTime() {
return validatedTime;
}
public void setValidatedTime(Long validatedTime) {
this.validatedTime = validatedTime;
}
public String getCreatorID() {
return creatorID;
}
public void setCreatorID(String creatorID) {
this.creatorID = creatorID;
}
}
@Cached
@Entity
public class PersonnelInfo extends ValidatedObject{
@Id
public String keyName;
@Parent Key<Department> department;
private Long fdID;
@Unindexed
private String userKeyName;
private String firstName;
private String lastName;
@Unindexed
private String address,city,county,state;
@Unindexed
private String cellPhone,homePhone,otherPhone;
public PersonnelInfo(){
}
public PersonnelInfo(String email){
keyName=email;
}
@Override
public Long getTimeUpdated() {
return timeUpdated;
}
@Override
public void setTimeUpdated(Long time) {
timeUpdated=time;
}
}
Mon code de requête est la suivante:
Query<PersonnelInfo> q = ofy.query(PersonnelInfo.class).ancestor(tmp).filter("timeUpdated >", lastSync);
Je reçois l'erreur "aucun index correspondant n'a été trouvé" à chaque fois. La requête fonctionne correctement sans le filtre. Le champ "timeUpdated" manque dans certaines entités car j'ai modifié le schéma. Certaines entités ont été créées après la modification du schéma avec des valeurs timeUpdated et ne sont pas renvoyées. Je peux aussi faire une requête GQL sur le spectateur datastore comme ceci:
select * D'où PersonnelInfo timeUpdated> 0
et je suis revenu des entités, ce qui me fait croire l'index est créé. Qu'est-ce que je fais mal ici? Toute aide serait appréciée!
yup! stickfigure à la rescousse à nouveau. Merci mec! Ma requête n'a jamais été exécutée en mode de développement – Patrick
Vous ne savez pas trop quand vous devez créer un index multi-propriétés. Par exemple si vous faites une requête ofy(). Query (someclass) .filter ("heure", heure) .filter ("personne", personne); droite? – Patrick
Il y a beaucoup de discussion sur cette page: https://developers.google.com/appengine/docs/java/datastore/queries Le résultat est que vous avez besoin de l'index lorsque vous utilisez plusieurs propriétés (ou prop + ancêtre), sauf que le moteur de recherche est parfois assez intelligent pour optimiser l'utilisation des index de propriété unique. Je crois que les requêtes d'égalité de deux propriétés peuvent être optimisées. – stickfigure