Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 列出Google数据存储中的2列,并使用Google云端点发送到Android客户端_Google App Engine_Jpa_Google Cloud Endpoints_Google Cloud Datastore - Fatal编程技术网

Google app engine 列出Google数据存储中的2列,并使用Google云端点发送到Android客户端

Google app engine 列出Google数据存储中的2列,并使用Google云端点发送到Android客户端,google-app-engine,jpa,google-cloud-endpoints,google-cloud-datastore,Google App Engine,Jpa,Google Cloud Endpoints,Google Cloud Datastore,在我的AppEngine连接的Android项目中,我想从Department实体获取2列。 该部门有3处房产。 1.Id 2.说明 3.成员 我只想获取Id和描述列。这是我的代码: Department Entity: @Entity public class Department { @Id private String id; private String descript

在我的AppEngine连接的Android项目中,我想从Department实体获取2列。 该部门有3处房产。 1.Id
2.说明
3.成员

我只想获取Id和描述列。这是我的代码:

Department Entity:
        @Entity
        public class Department {
              @Id
              private String id;

              private String description;

              @OneToMany(mappedBy = "department", fetch=FetchType.EAGER, cascade = CascadeType.ALL)
              private List<Manager> manager = new ArrayList<Manager>();

                  //getter and setter Method
        }
部门实体:
@实体
公共课系{
@身份证
私有字符串id;
私有字符串描述;
@OneToMany(mappedBy=“department”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
私有列表管理器=新建ArrayList();
//getter和setter方法
}
端点方法:

@ApiMethod(name = "listParent",path = "get_listParent")
public CollectionResponse<Department> listParent(
        @Nullable @Named("cursor") String cursorString,
        @Nullable @Named("limit") Integer limit,
        @Nullable @Named("fetch") String fetch) {

    EntityManager mgr = null;
    Cursor cursor = null;
    List<Department> execute1 = null;
    try {
        mgr = getEntityManager();
        Query query = mgr.createQuery("select description, 
                                id from Department as Department where id = '"+fetch+"'");
        if (cursorString != null && cursorString != "") {
            cursor = Cursor.fromWebSafeString(cursorString);
            query.setHint(JPACursorHelper.CURSOR_HINT, cursor);
        }
        if (limit != null) {
            query.setFirstResult(0);
            query.setMaxResults(limit);
        }
        execute1 = (List<Department>) query.getResultList();            
        for (Department obj : execute1){
            LOGGER.severe("Description:"+obj.getDescription());
        }

    } finally {
        mgr.close();
    }

  return CollectionResponse.<Department> builder().setItems(execute1)
            .setNextPageToken(cursorString).build();
}
@ApiMethod(name=“listParent”,path=“get\u listParent”)
公共集合响应列表父级(
@可为null的@Named(“游标”)字符串cursorString,
@可为空@Named(“limit”)整数限制,
@可空@Named(“fetch”)字符串(fetch){
EntityManager mgr=null;
游标=空;
List execute1=null;
试一试{
mgr=getEntityManager();
Query Query=mgr.createQuery(“选择描述,
作为部门的部门id,其中id=“+fetch+”);
if(cursorString!=null&&cursorString!=“”){
cursor=cursor.fromWebSafeString(cursorString);
setHint(JPACursorHelper.CURSOR\u HINT,CURSOR);
}
如果(限制!=null){
query.setFirstResult(0);
query.setMaxResults(限制);
}
execute1=(List)query.getResultList();
对于(部门目标:执行1){
LOGGER.severy(“说明:+obj.getDescription());
}
}最后{
经理关闭();
}
return CollectionResponse.builder().setItems(execute1)
.setNextPageToken(cursorString.build();
}
因此,obj.getDescription()抛出“无法转换为com.datanucleus.Department” java.lang.ClassCastException:[Ljava.lang.Object;无法转换为com.datanucleus.Department”异常

我怎样才能解决这个问题

提前谢谢

更新: 在上面的代码中,我使用以下代码解决java.lang.ClassCastException:

  execute = (List<Object[]>) query.getResultList();     
  Object[] firstRow = execute.get(0);
  LOGGER.severe("List ID"+firstRow[0]);
  LOGGER.severe("List Description"+firstRow[1]);
execute=(List)query.getResultList();
Object[]firstRow=execute.get(0);
LOGGER.severy(“列表ID”+第一行[0]);
记录器。严重(“列表说明”+第一行[1]);

现在我的问题是如何使用Endpoint将第一行数组发送到Android客户端。?

您在查询中选择了两个字段,似乎认为这意味着结果是一个部门,而这显然不是因为您只选择了这两个字段。这种情况下的结果是一个对象数组

如果你想要一个完整的部门,那么你需要

SELECT d FROM Department d ...

根据任何JPA文档,我建议您确定要从端点实现传递回Android客户端的对象

在您的情况下,您希望
id
说明仅适用于
部门
实体。虽然这将是一些额外的工作,但我建议您定义独立于实际实体对象的单独数据传输对象。它将有助于将来的增强/更改和升级松耦合


因此,您可以定义另一个Java类,比如DepartmentDTO或类似的类,并且在该类中仅具有id和description字段。然后,您可以将端点类签名更改为使用DepartmentDTO而不是Department实体。

感谢Neil Stockton的快速回复。我的问题是如何发送此对象数组to Endpoint方法的Android客户端。因为对象数组不是一种部门类型。谢谢Romin。我是云端点的新手,所以您可以给我一些链接来更改端点类签名以用作DepartmentDTO。您可以直接在代码本身中修改。生成DTO类将在数据存储中生成新实体,还是不生成?DTO类es与实体持久性无关。这些只是用于包含值的类。您必须处理任何与持久性相关的调用,才能将数据读入DTO和/或单独持久化DTO。使用DTO类是从数据存储访问实体的单个属性的唯一方法吗?请提出建议。谢谢!