Query使用Hibernate查询语言返回的迭代列表中的ClassCastException

时间:2013-11-13 08:57:26

标签: hibernate hql

我是hibernate的初学者。我正在尝试使用HQL的一个最简单的例子,但是当我尝试迭代list时,它会在第25行ClassCastException中生成异常。当我尝试转换next()方法返回的对象迭代器时它产生同样的问题。我无法确定问题。请给我解决问题的方法。

Employee.java

package one;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Employee {
@Id
private Long id;
private String name;
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Employee(Long id, String name) {
    super();
    this.id = id;
    this.name = name;
}
public Employee()
{

}

 } 


Main2.java

package one;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Main2 {

public static void main(String[] args) {

    SessionFactory sf=new Configuration().configure().buildSessionFactory();
    Session s1=sf.openSession();
    Query q=s1.createQuery("from Employee ");
    Transaction tx=s1.beginTransaction();

    List l=q.list();
    Iterator itr=l.iterator();
    while(itr.hasNext())
    {
        Object obj[]=(Object[])itr.next();//Line 25 
        for(Object temp:obj)
        {
        System.out.println(temp);   
        }
    }

    tx.commit();
    s1.close();
    sf.close();

}

}

2 个答案:

答案 0 :(得分:1)

应该是

Employee emp =(Employee)itr.next();//Line 25 

选择所有员工(“来自员工”)并迭代包含所有员工实体的结果列表。没有必要转换为object []。

迭代循环中的for循环也应该过时。

编辑:以下代码应该按照您的意图执行。

List l=q.list(); // you retrieve a List of Employee entities (the result of your query)
Iterator itr=l.iterator();
while(itr.hasNext())
{
    Employee emp = (Employee)itr.next();
    System.out.println(emp);   
    }
}

迭代器的替代方法可能是循环索引,如:

for(int i = 0; i<l.size(); i++){
  Employee emp = (Employee)l.get(i);
  System.out.println(emp);
}

答案 1 :(得分:0)

next()中的

Iterator将返回列表中的一个对象。所以,它应该如下所示:

Employee e =(Employee)itr.next();

如果您使用泛型类型,即使您不需要再次投射。