2010-04-26 5 views
0

J'ai une classe assez grande stockés dans le magasin de données, par exemple une classe d'utilisateurs avec beaucoup de champs (j'utilise java, en omettant toutes les décorations exemple ci-dessous pour plus de clarté):Désérialiser uniquement les propriétés de sélection d'une entité à l'aide de la chaîne de requête JDOQL?

@PersistenceCapable 
class User { 

    private String username; 
    private String city; 
    private String state; 
    private String country; 
    private String favColor; 
} 

Pour certaines requêtes des utilisateurs, Je ne ai besoin favColor la propriété, mais en ce moment je fais ceci:

SELECT FROM " + User.class.getName() + " WHERE username == 'bob' 

qui devrait désérialiser toutes les propriétés de l'entité. Est-il possible de faire quelque chose à la place comme:

SELECT username, favColor FROM " + User.class.getName() + " WHERE username == 'bob' 

et dans ce cas, toutes les instances de l'utilisateur renvoyés passeront seulement le temps désérialisation le nom d'utilisateur et les propriétés favColor, et non les propriétés ville/État/Pays? Si oui, alors je suppose que toutes les autres propriétés seront nulles (dans le cas des objets) ou 0 pour int/long/float?

Merci

Répondre

1

Non, cela est impossible avec l'App Engine datastore; votre entité entière est stockée dans un tampon de protocole et doit être désérialisée ensemble. Si vous avez vraiment de grandes propriétés qui ne sont pas souvent nécessaires, c'est probablement une bonne idée de les mettre dans un modèle séparé, bien que si vous parlez de seulement 3 chaînes, cela n'en vaut certainement pas la peine.

+0

Argh Je suis confus, je lis ceci (http://code.google.com/appengine/docs/java/datastore/relationships.html): "Les objets enfants sont chargés depuis le magasin de données quand ils sont accédés Si vous n'accédez pas à l'objet enfant sur un objet parent, l'entité de l'objet enfant n'est jamais chargée.Si vous voulez charger l'enfant, vous pouvez le "toucher" avant de fermer PersistenceManager (par exemple par appelez getContactInfo() dans l'exemple ci-dessus) ou ajoutez explicitement le champ enfant au groupe de récupération par défaut afin qu'il soit récupéré et chargé avec le parent. " – user246114

+0

Impossible de tout inclure dans le commentaire ci-dessus - donc nous ne pouvons pas explicitement faire la syntaxe du champ SELECT, mais nous pouvons obtenir un effet similaire en suivant la règle ci-dessus et en structurant intelligemment nos classes? Merci! – user246114

Questions connexes