2010-04-20 2 views
1

Я пытаюсь создать базу данных пользователей с соединением между пользователями (список друзей). Есть 2 основные таблицы: UserEntity (идентификатор основного поля) и FriendEntity с полями: - initiatorId - идентификатор пользователя, который инициировал дружбу - friendId - идентификатор пользователя, который был приглашен.Подзапросы на Java GAE Datastore

Теперь я пытаюсь найти всех друзей одного конкретного пользователя и столкнулся с некоторыми проблемами с использованием подзапросов в JDO здесь.

Логически запрос должен быть чем-то вроде этого: SQL: SELECT * FROM UserEntity ГДЕ СУЩЕСТВУЕТ (SELECT * FORM FriendEntity WHERE (initiatorId == UserEntity.id & & friendId == USERID) || (friendId == UserEntity. ID & & initiatorId == идентификатор пользователя))

или SELECT * FROM UserEntity Где идентификатор пользователя IN (SELECT * FROM FriendEntity ГДЕ initiatorId == UserEntity.id) или идентификатор_пользователя IN (SELECT * FROM FriendEntity ГДЕ friendId == UserEntity.id)

Чтобы воспроизвести последний запрос в JDOQL, я попытался сделать t он следующее:

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); 

В результате я получаю следующее сообщение об ошибке: неподдерживаемый метод при разборе выражения.

Не могли бы вы помочь с этим вопросом, пожалуйста?

ответ

1

Вы пытаетесь объединиться - вы не можете объединиться через Entities.

Вот пример делать простое соединение, если есть находящееся в собственности отношения http://gae-java-persistence.blogspot.com/2010/03/executing-simple-joins-across-owned.html

также посмотреть на этом веб-сайте он имеет много действительно полезной информации о получении живучесть материала, чтобы работать. а также несколько рабочих встреч для присоединений.

Вы можете установить отношения между объектами, для которых см. Документы GAE.

Смежные вопросы