假设我有一对多模型,涉及存储几本书及其章节,如
@Entity
public class Book {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key id;
private String title;
@OneToMany(mappedBy = "book", cascade = CascadeType.ALL)
private List<Chapter> chapters = new ArrayList<Chapter>();
// getters and setters
}
@Entity
public class Chapter {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key id;
private String title;
private int numPages;
@ManyToOne(fetch = FetchType.LAZY)
private Book book;
// getters and setters
}
然后像
一样坚持下去Book b = new Book();
b.setTitle("JDO 4eva");
Chapter c1 = new Chapter();
c1.setTitle("Intro");
c1.setNumPages(10);
b.getChapters().add(c1);
Chapter c2 = new Chapter();
c2.setTitle("Configuration");
c2.setNumPages(9);
b.getChapters().add(c2);
pm.currentTransaction().begin();
try {
pm.makePersistent(b);
pm.currentTransaction().commit();
} finally {
if (pm.currentTransaction().isActive()) {
pm.currentTransaction().rollback();
}
}
我的问题是,我如何仅选择特定书籍的章节,因为所有章节都是同一实体类型的商店,但没有相应书籍的参考(“外键”)。
在正常的sql中,我会查询它,例如“select * from chapter where book =”book_id“。这个查询在appengine中等同于什么?非常感谢。
注意:我从here获得了一些代码用于说明目的。
答案 0 :(得分:0)
我实际上是自己想出来的。
假设我要查询的章节的书的Key字符串是“agl2ZXJzZWZlZWRyDAsSBVRoZW1lGOQUDA”,我使用持久性管理器的getObjectById()方法获取该书籍对象,然后使用getter方法检索其下的章节列表等;
Key BookKey = KeyFactory.stringToKey("agl2ZXJzZWZlZWRyDAsSBVRoZW1lGOQUDA");
Book book = pm.getObjectById(Book.class,BookKey);
List<Chapter> chapters = book.getChapters();
for (Chapter chapter : chapters) {
//work on your chapters
}
希望这有助于某人。