如何从多对多的关系中获取每个对象
问题描述:
人是一个对象有名字和favoriteFoods,
食物是一个对象有名字和foodFans。如何从多对多的关系中获取每个对象
人与食物之间的关系是多对多
一个人可以有很多favoriteFoods的,
和食品可以有很多的foodFans
我写了一个简单的java来从各个favoriteFoods一个人
我想知道我所做的是正确的吗?
有没有更好的解决方案?
THANKS
PersistenceManager pm = PMF.get().getPersistenceManager();
//select from ...
Query query = pm.newQuery(Person.class);
//where ...
query.setFilter("name == nameParam");
//order by ...
query.setOrdering("id desc");
//declare a parameter to use later
query.declareParameters("String nameParam");
try {
@SuppressWarnings("unchecked")
//execute query
List<Person> results = (List<Person>) query.execute(person_name);
//if found
if (results.iterator().hasNext()) {
for (Person p : results) {
out.println("<p>" + p.getKey() + "</p>");
out.println("<p>" + p.getName() + "</p>");
Set<Key> foods = p.getFavoriteFoods();
Iterator<Key> i = foods.iterator();
while(i.hasNext()) {
Food f = pm.getObjectById(Food.class, i.next());
out.println("<p>" + f.getName()+ "</p>");
i.remove();
}
}
} else {
out.println("<p>Not Found.</p>");
}
} finally {
query.closeAll();
}
答
看起来像你使用JDO。应用程序引擎JDO文档使用这个确切的例子 - 人们和最喜欢的食物 - 他们和describe one recommended way to implement it: unowned many-to-many relationship。
具体而言,您首先要确定哪一方通常会有较少的相关实体。在这种情况下,平均食物可能会拥有比一般人最喜欢的食物(数百到数百)更多的粉丝(数百万)。
将人物的关键列表属性Set<Key> favoriteFoods
,为他们最喜欢的食物。为了得到一个人最喜欢的食物,你只需加载Person实体(这会花费一个数据存储获得)并查看favoriteFood
集合。为了获得食物的粉丝,你需要查询人物实体的favoriteFood
属性(GQL中的=
)食物。