2010-04-20 16 views
1

J'essaye de créer une base de données d'utilisateurs avec la connexion entre les utilisateurs (liste d'amis). Il y a 2 tables principales: UserEntity (champ principal id) et FriendEntity avec des champs: - initiatorId - id de l'utilisateur qui a initié l'amitié - friendId - id de l'utilisateur qui a été invité.Sous-requêtes sur Java GAE Datastore

Maintenant j'essaye d'aller chercher tous les amis d'un utilisateur particulier et j'ai rencontré quelques problèmes avec l'utilisation des sous-requêtes dans JDO ici.

Logiquement la requête doit être quelque chose comme ceci: SQL: SELECT * FROM UserEntity OÙ EXISTE (SELECT * FORMULAIRE FriendEntity OU (initiatorId == UserEntity.id & & friendID == userId) || (friendID == UserEntity. id & & initiatorId == userId))

ou SELECT * FROM WHERE UserEntity userId IN (SELECT * FROM FriendEntity OÙ initiatorId == UserEntity.id) OR userId IN (SELECT * FROM WHERE FriendEntity friendID == UserEntity.id) Donc, pour répliquer la dernière requête dans JDOQL, j'ai essayé de faire oici:

Query friendQuery = pm.newQuery(FriendEntity.class); 
friendQuery.setFilter("initiatorId == uidParam"); 
friendQuery.setResult("friendId"); 

Query initiatorQuery = pm.newQuery(FriendEntity.class); 
initiatorQuery.setFilter("friendId == uidParam"); 
initiatorQuery.setResult("initiatorId"); 


Query query = pm.newQuery(UserEntity.class); 
query.setFilter("initiatorQuery.contains(id) || friendQuery.contains(id)"); 
query.addSubquery(initiatorQuery, "List initiatorQuery", null, "String uidParam"); 
query.addSubquery(friendQuery, "List friendQuery", null, "String uidParam"); 
query.declareParameters("String uidParam"); 

List<UserEntity> friends = (List<UserEntity>) query.execute(userId); 

En conséquence, j'obtiens l'erreur suivante: méthode non prise en charge alors que l'expression analyse syntaxique.

Quelqu'un peut-il aider avec cette requête s'il vous plaît?

Répondre

1

Vous essayez de faire une jointure - Vous ne pouvez pas faire de jointures entre entités.

Voici un exemple de faire simple jointure s'il existe une relation appartenant http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html

Regardez aussi sur ce site web, il a beaucoup de très bonnes informations sur l'obtention de la substance de la persistance de travailler. ainsi que quelques solutions de rechange pour les jointures.

Vous pouvez définir des relations entre Entités, pour cela, consultez les documents GAE.