0

我有一个 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

这是调试的变量输出:

在此处输入图像描述

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

4

6 回答 6

3

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

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]);        
}
于 2013-07-17T10:09:07.253 回答
3

结果是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

于 2013-07-17T09:58:05.343 回答
2
List<Object[]> resultList = query.getResultList();
for (Object[] objects : resultList)
{
       for (Object object : objects)
       {
          System.out.println(object)
       }
}
于 2013-07-17T10:00:39.883 回答
1

您的查询结果是对象数组。

List resultList = query.getResultList();

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

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

于 2013-07-17T10:01:30.070 回答
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);         
}
于 2013-07-17T10:39:52.077 回答
-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));
  }         
}
于 2013-07-17T09:58:47.727 回答