使用Google App Engine(Java)中的祖先过滤器在事务中进行查询
Java说,应用程序可以在事务期间执行查询,但前提是它包含祖先过滤器,但没有关于如何执行的文档。有人能提供一些示例代码来说明如何以最简洁的方式实现这一点吗?如果您使用的是低级数据存储,这很容易,因为“祖先”是一个数据存储概念,而不是JDO/JPA概念 是指向javadoc的链接,其中显示了采用祖先键的查询构造函数。请尝试以下方法:使用Google App Engine(Java)中的祖先过滤器在事务中进行查询,java,google-app-engine,Java,Google App Engine,Java说,应用程序可以在事务期间执行查询,但前提是它包含祖先过滤器,但没有关于如何执行的文档。有人能提供一些示例代码来说明如何以最简洁的方式实现这一点吗?如果您使用的是低级数据存储,这很容易,因为“祖先”是一个数据存储概念,而不是JDO/JPA概念 是指向javadoc的链接,其中显示了采用祖先键的查询构造函数。请尝试以下方法: // PersistenceManager pm = ...; Transaction tx = pm.currentTransaction(); User user
// 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();
}
}
//PersistenceManager pm=。。。;
事务tx=pm.currentTransaction();
User=userService.currentUser();
列表我曾为这个问题挣扎过一段时间,但下面的方法会奏效的!简单的回答是,与appengine一起使用的JDO肯定可以支持祖先查询,因此您不必求助于appengine特有的低级API,特别是在您希望在整个应用程序中使用JDO的情况下
步骤1:
在子类中,确保具有以下实例变量。变量的实际名称并不重要。重要的是注释
@Persistent
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
private String mParentEncKey;
步骤2:
当通过父项查询子对象时,您希望通过您创建的实例变量的名称在父项上进行筛选。。。在本例中,如果要查询具有属性的一组子对象,则此示例适用于已知父项和该属性的情况
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;
}
publicstaticlist queryYourChildObjects(stringparentkey,stringsomeproperty){
PersistenceManager pm=PMF.get().getPersistenceManager();
Query q=pm.newQuery(ChildObject.class);
q、 setFilter(“mParentEncKey==parentKeyParam&&property==propertyParam”);
q、 declareParameters(“String parentKeyParam,String propertyParam”);
List results=(List)q.execute(parentKey,someProperty);
返回结果;
}
就这样!希望这能有所帮助 您还可以使用Objectify,如下面的相关回答:您没有在任何地方提交事务。