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

时间:2013-07-17 09:55:12

标签: 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 = ttdtarget.uniProtID");

List resultList = query.getResultList();

注意:我现在正在将结果集的大小限制为5,仅用于调试。我想从resultList获取每个对象内返回的值,它基本上是一个对象数组。

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

for (int i = 0; i < resultList.size(); i++)
{
System.out.println("->"+resultList.get(i));         
}

输出:

->[Ljava.lang.Object;@141ab9e
->[Ljava.lang.Object;@6a15ca
->[Ljava.lang.Object;@bcb654
->[Ljava.lang.Object;@1664b54
->[Ljava.lang.Object;@db953c

这是调试的变量输出:

enter image description here

所以我的问题是如何在对象中访问这些值。

6 个答案:

答案 0 :(得分:3)

你没有对象列表,它是一个Objectarrys列表

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]);        
}

答案 1 :(得分:2)

结果是List<Object[]>,所以投了那个。所以一个列表,其中每个元素都是一个值数组。然后,您必须将每个值转换为其类型(您事先知道)。

如果您只想迭代并打印:

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

或者,您可以创建一个具有这些确切字段的新类,使其构造函数接受所有值,并在查询中使用它:SELECT new Foo(.....) FROM..。在那里,您可以使用返回em.createQuery(..)

TypedQuery的通用替代方法

答案 2 :(得分:2)

List<Object[]> resultList = query.getResultList();
for (Object[] objects : resultList)
{
       for (Object object : objects)
       {
          System.out.println(object)
       }
}

答案 3 :(得分:1)

查询的结果是对象数组。

List resultList = query.getResultList();

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

或者您可以使用Bozho解决方案并从查询中创建新的直接。

答案 4 :(得分:0)

您可以使用所需的确切字段创建一个新类,并使用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);         
}

答案 5 :(得分:-1)

我很想建议嵌套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));
  }         
}