使用Google App Engine(Java)中的祖先过滤器查询事务

时间:2009-11-02 15:54:33

标签: java google-app-engine

Java documentation表示应用程序可以在事务期间执行查询,但前提是它包含祖先过滤器,但没有关于如何执行此操作的文档。任何人都可以提供一些示例代码,以最简洁的方式显示如何执行此操作吗?

3 个答案:

答案 0 :(得分:2)

我在这个问题上挣扎了一段时间,但以下情况会奏效!简短的回答是,与App Engine一起使用的JDO肯定可以支持Ancestor Queries,因此您不必使用App Engine独有的低级API,特别是在您希望在整个应用程序中坚持使用JDO的情况下。 / p>

第1步:

在子类中,请确保具有以下实例变量。变量的实际名称无关紧要。重要的是注释。

@Persistent
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
private String mParentEncKey;

第2步:

当通过父键查询子对象时,您希望通过您创建的实例变量的名称对parentKey进行过滤...在这种情况下,此示例适用于您是否要查询一组具有属性的子对象,只要您知道父键和该属性。

public static List<ChildObject> queryYourChildObjects(String parentKey, String someProperty) {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        Query q = pm.newQuery(ChildObject.class);
        q.setFilter("mParentEncKey == parentKeyParam && property == propertyParam");
        q.declareParameters("String parentKeyParam, String propertyParam");
        List<ChildObject> results = (List<ChildObject>) q.execute(parentKey, someProperty);
        return results;
    }

就是这样!希望这会有所帮助。

答案 1 :(得分:1)

尝试这种方法:

// PersistenceManager pm = ...;
Transaction tx = pm.currentTransaction();
User user = userService.currentUser();
List<Account> accounts = new ArrayList<Account>();

try {
    tx.begin();

    Query query = pm.newQuery("select from Customer " +
                              "where user == userParam " +
                              "parameters User userParam");
    List<Customer> customers = (List<Customer>)
    query.execute(user);

    query = pm.newQuery("select from Account " +
                        "where parent-pk == keyParam " +
                        "parameters Key keyParam");
    for (Customer customer : customers) {
        accounts.addAll((List<Account>)
        query.execute(customer.key));
    }

} finally {
    if (tx.isActive()) {
        tx.rollback();
    }
}

此处提供更多信息: http://code.google.com/appengine/docs/java/datastore/transactions.html#Uses_For_Transactions

答案 2 :(得分:0)

如果您使用的是低级别数据存储区,则很容易,因为“祖先”是数据存储区概念而不是JDO / JPA概念AFAIK。

here是javadoc的链接,显示带有祖先键的Query构造函数