在Google appengine中查询一对多模型

时间:2013-11-14 21:51:36

标签: sql google-app-engine

假设我有一对多模型,涉及存储几本书及其章节,如

@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获得了一些代码用于说明目的。

1 个答案:

答案 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
}

希望这有助于某人。