Google app engine 列出Google数据存储中的2列,并使用Google云端点发送到Android客户端
在我的AppEngine连接的Android项目中,我想从Department实体获取2列。 该部门有3处房产。 1.IdGoogle 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
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类是从数据存储访问实体的单个属性的唯一方法吗?请提出建议。谢谢!