如何解决Hibernate中query.list()出现的java.lang.ClassCastException错误

4

我将使用Hibernate执行select操作,查询语句正在执行,但在query.list()方法处出现异常。

这是我的代码:

String hql="select a.vehicleno, a.lat, a.lng, a.status, a.rdate, a.rtime from LatitudeBean a, VehicleRegisterBean b where a.vehicleno=b.vehicleno and b.clientid= :clientId and b.groupid in(select groupid from GroupDetails where groupname= :groupname and clientid= :gdclientId)"; // valid query
Query query =sessio.createQuery(hql);
List<LatitudeBean> groupList = (List<LatitudeBean>)query.list(); //Here I am getting exception
for(LatitudeBean arr : groupList){
        System.out.println(arr.getVehicleno());
    }

Exception是指,

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.aurodisplay.its.beans.LatitudeBean
at com.abc.its.controller.LoginController.doPost(LoginController.java:83)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

如何转换从list()方法返回的列表。请有人帮我。

1
请同时发布您的异常堆栈跟踪。 - Buhake Sindi
@BuhakeSindi 请看我的更新问题。 - Raghu
@Adi,请看一下我更新后的问题。 - Raghu
1个回答

8
问题在于您的查询并没有选择实体,而只是选择了实体的属性。
因此,结果不会是实体的列表,而是一个对象数组的列表(这些数组将保存所选属性)。
请尝试以下内容:
List<Object[]> groupList = (List<Object[]>) query.list();
for(Object[] arr : groupList) {
    System.out.println("vehicleno: " + arr[0]);
}

如果你想选择整个实体,可以修改查询语句如下:

String hql = "select a from LatitudeBean a, VehicleRegisterBean b where ...";

这样,你的原始代码就会正常工作。


哦,好的。那我该怎么改呢? - Raghu
这里所有选定的属性都来自于LatitudeBean。那么我需要在查询或逻辑中进行更改吗? - Raghu
增加了如何处理结果。 - icza
我们能不能改成LatitudeBean,因为我选择的字段都是LatitudeBean中的唯一字段。 - Raghu
可以的。修改你的查询以返回“完整”的实体。已添加到答案中。 - icza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接