2010-01-18 7 views
0

Bon, je ne sais pas si j'aboie complètement le mauvais arbre ici - je trouve que JDO et Google App Engine sont un peu compliqués à saisir. Quoi qu'il en soit, voilà.Accéder à une classe personnalisée à partir d'une classe JDO

J'ai une classe qui contient une autre classe comme l'un de ses variables internes (voir player1)

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
    public class JDOGame 
    {  
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String map; 

    @Persistent 
    private RPCDataPlayer player1; 

    // getters, setters, constructors etc... 
    } 

La RPCDataPlayer classe est Serializable et très basique ....

public class RPCDataPlayer implements IsSerializable 
{ 
    public String name; 
    public int id; 

     // getters & setters & constructors oh my 

     public int getId() { return id; } 
} 

Ainsi, ma question est ... comment puis-je créer une requête où je peux obtenir tous les JDOGames qui contiennent un RPCDataPlayer avec id = x?

Je ne peux pas faire une requête comme ...

SELECT FROM JDOGame.class.getName() WHERE player1.getId() == x 

... alors quelles techniques ou suggestions que les gens ont pour que cela fonctionne?

Merci d'avance.

+0

La seule façon dont je pensais qu'il pourrait fonctionner est d'obtenir toutes les instances de JDOGame de la Banque de données itérer puis à travers eux - mais cela ne semble pas particulièrement efficace :(Merci – Spedge

Répondre

2

La base de données Google App Engine n'étant pas une base de données relationnelle, vous ne pouvez pas effectuer de jointures. Vous pouvez conserver RPCDataPlayer en tant que table.

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class RPCDataPlayer { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 

    @Persistent(mappedBy = "player1") 
    private List<JDOGame> jdoGames = new ArrayList<JDOGame>(); 

    @Persistent 
    public String name; 

    @Persistent 
    public int id; 

    public int getId() { 
     return id; 
    } 

    public Key getKey() { 
     return key; 
    } 

    public void setJdoGames(List<JDOGame> jdoGames) { 
     this.jdoGames = jdoGames; 
    } 

    public List<JDOGame> getJdoGames() { 
     return jdoGames; 
    } 

} 

Et puis vous pouvez simplement interroger ceci comme ceci.

SELECT FROM RPCDataPlayer.class.getName() WHERE id == x 

Une fois que vous avez et instance de RPCDataPlayer vous pouvez obtenir obtenir JDOGame en appelant:

List<JDOGame> jdoGames = rpcDataPlayer.getJdoGames(); 
+0

Kodova, mais je ne suis pas tout à fait sûr comment cela fonctionnera Chaque jeu a un seul joueur, mais un seul joueur peut faire partie de beaucoup de jeux Et si j'ajoute un deuxième joueur, appelé joueur2? Désolé pour ne pas être clair. – Spedge

+0

Avec le code mis à jour, vous pouvez retirer tous les jeux pour un joueur.Si vous ajoutez un joueur, vous pouvez soit ajouter player2 aussi JDOGame et dupliquer les jdoGames dans PRCDataPlayer et fusionner les deux listes.Le meilleur moyen serait de créer un tabl e qui contient le JDOGame, RCPDataPlayer et playerNumber. Cela nécessiterait une relation Many-To-Many que vous pouvez lire ici http://code.google.com/appengine/docs/java/datastore/relationships.html#Unowned_Relationships – Kodova

+0

Hmm, à droite - merci Kodova, je reçois maintenant. Cela me détache des bases de données relationnelles, ce qui est difficile! – Spedge

1

Votre champ est publié en feuilleton dans le magasin de données, de sorte que vous ne pouvez évidemment pas faire une requête dans le magasin de données, par conséquent, tous ces enregistrements doivent être récupérés et la requête effectuée en mémoire. Quand GAE/J finira par se mettre ensemble et laissera les gens le faire, alors ce sera trivial, jusqu'à ce que vous ayez besoin de récupérer tous les enregistrements vous-même et de faire la vérification.

Rien à voir avec joint à tous

+0

Merci pour cela, j'ai senti que ça aurait dû être possible. Je vais le faire comme ci-dessus, et attends mon temps ... – Spedge

Questions connexes