为什么一列查询返回的列表无法使用Object数组进行迭代?

时间:2015-08-29 16:41:49

标签: hibernate object

考虑以下代码:

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的参考?

1 个答案:

答案 0 :(得分:1)

选择Foo类型的单个字段(在您的情况下为Integer)的查询将返回List<Foo>(即您的情况下为List<Integer>)。< / p>

例如,选择类型为FooBar的多个字段的查询将返回List<Object[]>。每个对象数组将包含与select子句中的字段一样多的元素,顺序相同。因此,在此示例中,它将包含Foo和Bar。

这是JPA规范指定的内容,对我来说似乎很自然:将单个字段包装到Object中是不必要的,会消耗内存,并且使用起来很麻烦,因为你必须打开对象来自包含它的数组。