Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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
Java 如何在包含多个字段的对象数组中迭代?_Java_Jpa_Jpql - Fatal编程技术网

Java 如何在包含多个字段的对象数组中迭代?

Java 如何在包含多个字段的对象数组中迭代?,java,jpa,jpql,Java,Jpa,Jpql,我有一个resultList,它从查询多个表的JPQL查询中获取结果,如下所述: Query query = em.createQuery("SELECT protein.gid,protein.uniProtAccession,protein.name,protein.ECNumber,ttdtarget.uniProtID,ttdtarget.gid FROM Protein protein,TtdTarget ttdtarget WHERE protein.uniProtAccession

我有一个resultList,它从查询多个表的JPQL查询中获取结果,如下所述:

Query query = em.createQuery("SELECT protein.gid,protein.uniProtAccession,protein.name,protein.ECNumber,ttdtarget.uniProtID,ttdtarget.gid FROM Protein protein,TtdTarget ttdtarget WHERE protein.uniProtAccession = ttdtarget.uniProtID");
List resultList=query.getResultList

注意:我现在将resultset的大小限制为5,只是为了调试。我想从resultList中获取每个对象内部返回的值,resultList基本上是一个对象数组

到目前为止,我已经尝试迭代到对象,但无法访问内部值

for (int i = 0; i < resultList.size(); i++)
{
System.out.println("->"+resultList.get(i));         
}
下面是调试中变量的输出:

因此,我的问题是如何访问对象中的这些值。

结果是列表,所以请转换为列表。这是一个列表,其中每个元素都是一个值数组。然后必须将每个值强制转换为您事先知道的类型

如果您只是想迭代和打印:

List<Object[]> resultList = (List<Object[]>) query.getResultList();
for (Object[] array : resultList) {
   for (Object field : array) {
      System.out.println("->"+field); 
   }
}

或者,您可以创建一个具有这些精确字段的新类,使其构造函数接受所有值,并在查询中使用它:selectnewfoo。。。。。从…起在这里,您可以使用em.createQuery的通用替代方法。。返回TypedQuery

我建议嵌套for循环:

for (int i = 0; i < resultList.size(); i++)
{
  for(int j = 0; j < resutList.get(i).size(); j++){
    System.out.println("->"+resultList.get(i).get(j));
  }         
}
TypedQuery<CustomClass> query = em.createQuery("" /* Query String */, CustomClass.class);
List<CustomClass> resultList = query.getResultList();
foreach (CustomClass result : resultList){
    // Need to override method toString() in CustomClass
    System.out.println("->" + result);         
}

查询的结果是对象数组

List resultList = query.getResultList();

for(Object result : resultList) {
  Object[] results = (Object[]) result;
   for(Object res : results) {
     System.out.println(res);
   }
}

或者,您也可以使用Bozho解决方案,通过查询创建新的direct from

您没有对象列表,它是ObjectArry列表

List<Object[]> resultList = (List<Object[])resultList;
for (int i = 0; i < resultList.size(); i++)
{
  System.out.print("protein.gid ->"+resultList.get(i)[0]);
  System.out.println("protein.uniProtAccession ->"+resultList.get(i)[1]);        
}

您可以使用所需的确切字段创建一个新类,并使用TypedQuery

TypedQuery<CustomClass> query = em.createQuery("" /* Query String */, CustomClass.class);
List<CustomClass> resultList = query.getResultList();
foreach (CustomClass result : resultList){
    // Need to override method toString() in CustomClass
    System.out.println("->" + result);         
}

您不能将createQuery的通用版本用于此类查询。javadoc说:查询的select列表必须只包含一个项目,该项目必须可分配给resultClass参数指定的类型。谢谢,我将把它添加到从该选项开始的备选方案中,然后将顺序搞乱:great answer@Bozho!这是一份清单,不是清单。谢谢你的澄清!这部分给出了错误:resultList.geti[0],无法作为数组访问。很抱歉,我放弃了转换
TypedQuery<CustomClass> query = em.createQuery("" /* Query String */, CustomClass.class);
List<CustomClass> resultList = query.getResultList();
foreach (CustomClass result : resultList){
    // Need to override method toString() in CustomClass
    System.out.println("->" + result);         
}