Java 投影查询:如何使用JPA为AppEngine中的新实体加载原始字符串?

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<

如何为AppEngine中全新的、空的、不存在的表加载字符串列表?我试着效仿这个例子:

但这给了我一个错误:

原因:javax.persistence.PersistenceException:尚未解析查询的类AdminUser。检查查询和任何导入/别名规范

原因:org.datanucleus.exceptions.ClassNotResolvedException:尚未解析查询的类AdminUser。检查查询和任何导入/别名规范

代码如下:

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这是非常没有帮助的。你看了示例链接了吗?读者的角色是发表评论,这样提问的人实际上会提出一个可理解的问题;这是当前的趋势