Java 投影查询:如何使用JPA为AppEngine中的新实体加载原始字符串?
如何为AppEngine中全新的、空的、不存在的表加载字符串列表?我试着效仿这个例子: 但这给了我一个错误: 原因:javax.persistence.PersistenceException:尚未解析查询的类AdminUser。检查查询和任何导入/别名规范 原因:org.datanucleus.exceptions.ClassNotResolvedException:尚未解析查询的类AdminUser。检查查询和任何导入/别名规范 代码如下:Java 投影查询:如何使用JPA为AppEngine中的新实体加载原始字符串?,java,google-app-engine,jpa,entity,google-cloud-datastore,Java,Google App Engine,Jpa,Entity,Google Cloud Datastore,如何为AppEngine中全新的、空的、不存在的表加载字符串列表?我试着效仿这个例子: 但这给了我一个错误: 原因:javax.persistence.PersistenceException:尚未解析查询的类AdminUser。检查查询和任何导入/别名规范 原因:org.datanucleus.exceptions.ClassNotResolvedException:尚未解析查询的类AdminUser。检查查询和任何导入/别名规范 代码如下: public java.util.List<
public java.util.List<String> getAdmin() {
EntityManager em = EMF.get().createEntityManager();
try {
TypedQuery<String> tq = em.createQuery("select au.email from AdminUser as au", String.class);
return tq.getResultList(); ///// <=== EXCEPTION
public java.util.List getAdmin(){
EntityManager em=EMF.get().createEntityManager();
试一试{
TypedQuery tq=em.createQuery(“选择au.email from AdminUser as au”,String.class);
return tq.getResultList();//GAE Datastore是一个无模式的NoSQL数据库。没有表。只有必须具有种类、id并且可以具有任意属性集的实体
您可以使用,为您提供漂亮的类型化Java类,而不是。AppEngine不支持示例链接中的JPA原始原始查询。我必须直接使用DatastoreService API。以下是我尝试的。需要进行一些清理,因为许多事情都不起作用,但这确实起到了作用
public java.util.List<String> getAdmin() {
log.info("getAdmin()");
// AppEngine does not support strong consistency... will frequently return stale results. Setting read policy won't work.
// Construct a read policy for strong consistency
ReadPolicy policy = new ReadPolicy(ReadPolicy.Consistency.STRONG);
// Set the read policy
DatastoreServiceConfig consistentConfig = DatastoreServiceConfig.Builder.withReadPolicy(policy);
// Get Datastore service with the given configuration
DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService(consistentConfig);
com.google.appengine.api.datastore.Query query = new com.google.appengine.api.datastore.Query("AdminUser");
// DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
java.util.List<Entity> events = datastoreService.prepare(query).asList(FetchOptions.Builder.withDefaults());
ArrayList<String> al = new ArrayList<String>();
for(Entity entity: events) {
String s = entity.getProperty("email").toString();
al.add(s);
}
if(true) return al;
@SuppressWarnings("unused")
EntityManager em = EMF.get().createEntityManager();
try {
TypedQuery<String> tq = em.createQuery("select au.email from AdminUser as au", String.class);
return tq.getResultList();
} catch (ClassNotResolvedException | javax.persistence.PersistenceException cnre) {
// catch the exception because AppEngine DataStore has no way to create a new empty Entity table.
log.warning("AdminUser entity does not exist or is empty.");
return new java.util.ArrayList<String>();
} finally {
em.close();
}
// log.info("getAdmin(): al.size(): " + al.size());
}
public void setAdmin(java.util.List<String> admin) {
log.info("setAdmin(), admin.size():"+admin.size());
// delete all AdminUsers
com.google.appengine.api.datastore.Query query = new com.google.appengine.api.datastore.Query("AdminUser");
DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
java.util.List<Entity> events = datastoreService.prepare(query).asList(FetchOptions.Builder.withDefaults());
for(Entity entity: events) {
datastoreService.delete(entity.getKey());
}
// EntityManager em = EMF.get().createEntityManager();
// Query q = em.createQuery("delete from AdminUser");
// q.executeUpdate();
// DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
for (String s: admin) {
log.info("creating AdminUser Entity...");
Entity e = new Entity("AdminUser");
e.setProperty("email", s);
datastoreService.put(e);
}
// Must wait for Datastore to actually write records. Ignores consistency even with strong consistency set.
// this doesn't even work sometimes...
//try { Thread.sleep(5000); } catch (InterruptedException e) {}
// EntityManager em = EMF.get().createEntityManager();
// for (String s: admin) {
// Entity e = new Entity("AdminUser");
// e.setProperty("email", s);
// em.persist(e);
// }
// em.close();
} // setAdmin()
public java.util.List getAdmin(){
log.info(“getAdmin()”);
//AppEngine不支持强一致性…将经常返回过时的结果。设置读取策略无效。
//为强一致性构建读取策略
ReadPolicy policy=newreadpolicy(ReadPolicy.Consistency.STRONG);
//设置读取策略
DatastoreServiceConfig consistentConfig=DatastoreServiceConfig.Builder.withReadPolicy(策略);
//获取具有给定配置的数据存储服务
DatastoreService DatastoreService=DatastoreServiceFactory.getDatastoreService(consistentConfig);
com.google.appengine.api.datastore.Query Query=new com.google.appengine.api.datastore.Query(“AdminUser”);
//DatastoreService DatastoreService=DatastoreServiceFactory.getDatastoreService();
java.util.List events=datastoreService.prepare(query).asList(FetchOptions.Builder.withDefaults());
ArrayList al=新的ArrayList();
for(实体:事件){
字符串s=entity.getProperty(“电子邮件”).toString();
等。添加(s);
}
如果(真)返回al;
@抑制警告(“未使用”)
EntityManager em=EMF.get().createEntityManager();
试一试{
TypedQuery tq=em.createQuery(“选择au.email from AdminUser as au”,String.class);
返回tq.getResultList();
}catch(ClassNotResolvedException | javax.persistence.PersistenceException cnre){
//捕获异常,因为AppEngine数据存储无法创建新的空实体表。
警告(“AdminUser实体不存在或为空”);
返回新的java.util.ArrayList();
}最后{
em.close();
}
//log.info(“getAdmin():al.size():”+al.size());
}
public void setAdmin(java.util.List admin){
log.info(“setAdmin(),admin.size():”+admin.size());
//删除所有管理员用户
com.google.appengine.api.datastore.Query Query=new com.google.appengine.api.datastore.Query(“AdminUser”);
DatastoreService DatastoreService=DatastoreServiceFactory.getDatastoreService();
java.util.List events=datastoreService.prepare(query).asList(FetchOptions.Builder.withDefaults());
for(实体:事件){
datastoreService.delete(entity.getKey());
}
//EntityManager em=EMF.get().createEntityManager();
//Query q=em.createQuery(“从AdminUser删除”);
//q.executeUpdate();
//DatastoreService DatastoreService=DatastoreServiceFactory.getDatastoreService();
for(字符串s:admin){
log.info(“创建AdminUser实体…”);
实体e=新实体(“AdminUser”);
e、 setProperty(“电子邮件”,s);
datastoreService.put(e);
}
//必须等待数据存储实际写入记录。即使设置了强一致性,也会忽略一致性。
//这有时甚至不起作用。。。
//试试{Thread.sleep(5000);}catch(InterruptedException e){}
//EntityManager em=EMF.get().createEntityManager();
//for(字符串s:admin){
//实体e=新实体(“AdminUser”);
//e.setProperty(“电子邮件”);
//em.e;
// }
//em.close();
}//setAdmin()
是的,我读过,但它没有说明如何创建空表/实体。我需要先从表中读取数据,然后才能创建要插入的行。通常,对于web应用程序,您可以直接进入数据库并创建表。您是否间接地说,Google AppEngine不支持创建表/实体来引导rap是一个web应用程序?确切地说,没有架构,所以没有表可定义。GAE上有超过10万个应用程序,所以它们一定做得对,对吗?此外,您的JPA异常似乎是由于您没有定义AdminUser
类。这与AppEngine或其数据存储无关。JPA是一个帮助程序库将数据从数据库映射到Java类。我想说的是,你的行为应该是有漏洞的,而不是在Google的appengine设计中。如果你不想创建AdminUser类,那么就不要参考它。从阅读JPA规范和关于JPQL的部分开始,并参考你实际拥有的类。为什么不提及什么类呢你确实有?你想选择该类的哪个字段?@DataNucleus这是非常没有帮助的。你看了示例链接了吗?读者的角色是发表评论,这样提问的人实际上会提出一个可理解的问题;这是当前的趋势