使用googleappengine(java)中的祖先过滤器在事务中进行查询

ddhy6vgd  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(210)

java文档说,应用程序可以在事务期间执行查询,但前提是它包含祖先过滤器,但没有文档说明如何执行。有没有人能提供一些示例代码来说明如何以最简洁的方式实现这一点?

ergxz8rk

ergxz8rk1#

我挣扎了一段时间,但下面会工作!简而言之,与appengine一起使用的jdo肯定可以支持祖先查询,因此您不必求助于appengine独有的低级api,特别是在您希望在整个应用程序中都使用jdo的情况下。
第一步:
在子类中,确保具有以下示例变量。变量的实际名称并不重要。重要的是注解。

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

第二步:
当通过父项查询子对象时,您希望通过您创建的示例变量的名称对父项进行筛选。。。在本例中,如果要查询一组具有属性的子对象,则此示例适用于已知父键和该属性的情况。

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

就这样!希望这有帮助。

zfciruhq

zfciruhq2#

尝试以下方法:

// 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

h7appiyu

h7appiyu3#

如果您使用的是底层数据存储,那么这很容易,因为“祖先”是一个数据存储概念,而不是jdo/jpa概念。
这里有一个指向javadoc的链接,显示了采用祖先键的查询构造函数

相关问题