将List转换为Object <class>?</class>的ClassCastException

时间:2013-09-18 12:22:56

标签: java list collections classcastexception

我正在尝试从数据库中检索值并将其存储在List

数据被检索并正常工作,但当我将List转换为Object<pojo class>时,我得到了一个例外,

我的代码是

Query qry=session.createQuery("select personaldetails.fname,personaldetails.lname from Personaldetails as personaldetails where refId=1001");
List<Personaldetails> l=(List<Personaldetails>)qry.list();
session.getTransaction().commit();
session.close();
System.out.println("--->"+l.size());  //List 'l' holds the values from DB
Personaldetails p; //This is an pojo class
p=(Personaldetails)l.get(i);  //Here i am getting the exception here
System.out.println("Person name "+p.getFname());

在上面提到的行中我得到了ClassCastException的异常,我不知道为什么,我试过它在编译时没有显示错误。

任何建议都将不胜感激....

2 个答案:

答案 0 :(得分:5)

我看到您正在进行选择性查询 - 选择fnamelname

select personaldetails.fname,personaldetails.lname from Personaldetails as personaldetails where refId=1001

返回List<Object[]>,其中数组中的每个元素代表2列值

列表类似于[{"Fname1", "LName1"}, {"Fname2", "Lname2"}]

所以ClassCastException是因为您要将Object[]转换为PersonDetails

  • 要期望List<PersonDetails>作为结果,您可以使用

    之类的查询

    select from Personaldetails as personaldetails where refId=1001

  • 或者您可以遍历List<Object[]>并自己构建PersonDetails

    for(Object[] arr : l) {
       PersonDetails p = new PersonDetails();
       p.setFName(arr[0]);
       p.setLName(arr[1]);
    }
    

我更喜欢第一种方法

答案 1 :(得分:1)

  

在上面提到的行中,我得到了Exception作为ClassCastException,i   不知道为什么,我试过它在编译时没有显示错误。

当您显式转换时,编译器无法帮助您。类型转换是告诉编译器您知道此类型是其他类型的方法。编译器相信您知道自己在做什么。

这里真正的问题是如何创建列表?

Query qry=session.createQuery("select personaldetails.fname,personaldetails.lname from Personaldetails as personaldetails where refId=1001");
List<Personaldetails> l=(List<Personaldetails>)qry.list();

你怎么知道qry.list()返回一个List?您刚刚运行了一条SQL语句并跳转到了List。由于强制转换为List工作正常,因此显然返回了一个List(尽管由于类型擦除,我们不知道它实际上是否只包含Personaldetails对象)。

必须返回一个List。 @sanbhat似乎已经指出了该方法的正确结构。我对Hibernate没有任何经验。