使用for-each遍历createSQLQuery的结果

时间:2012-01-19 12:46:33

标签: java hibernate foreach

考虑一下:

//members is a table.
String sql="select * from members"; 

Query query = session.createSQLQuery(sql);
List list = query.list();   

/***Ist part**This part is working well.******************************/

for(int j=0;j<list.size();j++){
    Object [] obj= (Object[])list.get(j);
    for(int i=0;i<obj.length;i++)
        System.out.println(obj[i]);
}

/***2nd part********This part is not working.Why???******************/

    for( Object[] objArr : list){       //---------->(1)

         for(Object m:objArr){

        System.out.println(((Member)m).getFirstname());
        }
    }

我想问的是,为什么语句(1)给出了以下错误,尽管 list 中的每个元素都是Objects数组,即Object []:

compile:

    [javac] E:\prac java progs\hiber3\src\Dao.java:45: incompatible types
    [javac] found   : java.lang.Object
    [javac] required: java.lang.Object[]
    [javac]             for( Object[] objArr : list){
    [javac]                                    ^
    [javac] 1 error

2 个答案:

答案 0 :(得分:1)

list List(意为List<?>)投放到List<Object[]>

我的意思是

List<Object[]> list = (List<Object[]>)query.list();   

答案 1 :(得分:1)

您的列表声明为List。这是一种原始类型,因此Java编译器不知道列表中的内容。它只知道它包含Object的实例,因为Java中的类扩展了Object。所以

for (Object[] objArr : list)

无法编译,因为您尝试将类型为Object的对象分配给类型为Object[]的变量。需要演员才能做到这一点。

所以,有两个解决方案。您知道该列表实际上包含Object[]个实例,因此您将列表转换为List<Object[]>

List<Object[]> list = (List<Object[]>) query.list();
for(Object[] objArr : list) {

或者您将列表的每个元素都投射到Object[]

for (Object o : list) {
    Object[] objArr = (Object[]) o;