Java 如何在包含多个字段的对象数组中迭代?
我有一个resultList,它从查询多个表的JPQL查询中获取结果,如下所述: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
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);
}