java.lang.ClassCastException: java.lang.String 不能转换为 [Ljava.lang.Object

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3777334/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 04:51:34  来源:igfitidea点击:

java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object

javahibernate

提问by lakshmi

I'm running the following query. It displays an error message. How to solve this error?

我正在运行以下查询。它显示一条错误消息。如何解决这个错误?

        List<Route>routeList=null;
        List<?> companyList = session.createSQLQuery ("select name " +
                                                  "from company "+
                                                  "where company_id= " + companyId).list();                 
        if(companyList.size() <= 0){
            //throw(new AppException(1018,ErrorMessages.getString("INVALID_USER_ID"))); 
        }


        routeList = new ArrayList<Route>(companyList.size());
    Route vgDetails=null;

        for (int i = 0; i < companyList.size(); i++) {

            vgDetails = new Route(); 
            Object[] row = (Object[])companyList.get(i);                                 
            vgDetails.setRouteName ((String)row[0]);                     
            routeList.add(vgDetails);       
        }                   
    session.getTransaction().commit();
        return routeList;
    }

The errror is:

错误是:

java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object;
    at com.claystone.server.user.UserListServiceImpl.getParticipantsDestination(UserListServiceImpl.java:902)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)

采纳答案by Ronald Wildenberg

You can just write:

你可以只写:

vgDetails = new Route();                                 
vgDetails.setRouteName ((String)companyList.get(i));

companyListis already a list of strings because you select just one column.

companyList已经是一个字符串列表,因为您只选择了一列。

Additionally, as Thilo's answer also suggests, you can cast your result directly to a List<string>instead of using List<?>.

此外,正如 Thilo 的回答所暗示的那样,您可以将结果直接转换为 aList<string>而不是使用List<?>.

回答by Thilo

Your companyList contains Strings, not Object[].

您的 companyList 包含字符串,而不是 Object[]。

You should write

你应该写

List<String> companyList = (List<String>) session.createSQLQuery (
      "select name from company where company_id=?", companyId).list();


for (String routeName: companyList) {
        vgDetails = new Route();                            
        vgDetails.setRouteName (routeName);                     
        routeList.add(vgDetails);       
    }               

回答by Buhake Sindi

Hibernate is return an array of String (aka a List of type String)

Hibernate 返回一个字符串数组(又名字符串类型的列表)

 List<?> companyList = session.createSQLQuery ("select name " +
                                                  "from company "+
                                                  "where company_id= " + companyId).list();   

Because your query returns a String of names from Company table.

因为您的查询返回 Company 表中的名称字符串。

What you have to do return a List

你必须做什么返回一个列表

 List<String> companyList = (List<String>)session.createSQLQuery ("select name " +
                                                  "from company "+
                                                  "where company_id= " + companyId).list();

Change your error, from this:

改变你的错误,从这个:

 vgDetails = new Route(); 
            Object[] row = (Object[])companyList.get(i);                                 
            vgDetails.setRouteName ((String)row[0]);                     
            routeList.add(vgDetails);

To this:

对此:

vgDetails = new Route();                                
vgDetails.setRouteName (companyList.get(i));                     
routeList.add(vgDetails);

as companyList.get(i)returns a String.

ascompanyList.get(i)返回一个字符串。