2012-06-05 2 views
1

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!

Répondre

2

Vous avez besoin d'un index à plusieurs propriétés défini dans votre datastore-indexes.xml. Il devrait être ajouté à datastore-indexes-auto.xml lorsque vous exécutez la requête en mode dev, mais le résultat devrait ressembler à ceci:

<datastore-index kind="PersonnelInfo" ancestor="true"> 
    <property name="timeUpdated" direction="asc"/> 
</datastore-index> 
+0

yup! stickfigure à la rescousse à nouveau. Merci mec! Ma requête n'a jamais été exécutée en mode de développement – Patrick

+0

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

+0

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

Questions connexes