考虑以下代码:
Query query1 = session.createQuery("select c.marks from StudentEntity c");
List<Object[]> l = query1.list();
for (Object[] object : l)
{
System.out.print(object[0]);
System.out.println("______________");
}
它抛出ClassCast异常,如下所示:
java.lang.ClassCastException: java.lang.Integer cannot be cast to [Ljava.lang.Object;
我知道这个例外的含义: 整数不能转换为1-D对象数组
而不是Object数组列表,如果我使用对象类型列表来迭代查询返回的列表,它会给我所需的输出,如下所示:
List<Object[]> l = query1.list();
for (Object object : l)
{
System.out.print(object);
System.out.println("______________");
}
78______________
65______________
77______________
据我所知,查询返回的列表中只有一个属性。对于超过1列,我必须使用Object数组。
但我的问题是,为什么返回1列的列表无法使用大小为1的Object数组进行迭代(如第1段代码片段.i.e.object [0])?
结果列表是否必须包含多于1列才有资格使用Object数组类进行迭代?
是因为Integer类扩展了Object类而不是Object数组类,而Object数组只有在查询返回多个列时才进入图片,因为只能从Object中检索返回2列的列表吗?
Java文档中是否有关于何时应该使用Object数组和何时使用Object的参考?
答案 0 :(得分:1)
选择Foo
类型的单个字段(在您的情况下为Integer
)的查询将返回List<Foo>
(即您的情况下为List<Integer>
)。< / p>
例如,选择类型为Foo
和Bar
的多个字段的查询将返回List<Object[]>
。每个对象数组将包含与select子句中的字段一样多的元素,顺序相同。因此,在此示例中,它将包含Foo和Bar。
这是JPA规范指定的内容,对我来说似乎很自然:将单个字段包装到Object中是不必要的,会消耗内存,并且使用起来很麻烦,因为你必须打开对象来自包含它的数组。