2010-09-23 3 views
2

Je cours la requête suivante. Il affiche un message d'erreur. Comment résoudre cette erreur?java.lang.ClassCastException: java.lang.String ne peut pas être converti en [Ljava.lang.Object

 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; 
    } 

Le errror est:

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) 
+0

Quel est le nom de la classe à partir de laquelle vous avez donné l'extrait de code ci-dessus? Un numéro de ligne? –

Répondre

5

Vous pouvez simplement écrire:

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

companyList est déjà une liste de chaînes parce que vous sélectionnez une seule colonne. De plus, comme la réponse de Thilo le suggère également, vous pouvez convertir votre résultat directement en List<string> au lieu d'utiliser List<?>.

1

Votre liste d'entreprise contient des chaînes, pas Object [].

Vous devriez écrire

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);  
    }    
+0

Cela ne résoudra pas le problème car il laisse toujours la distribution à 'Object []' qui provoque l'exception. –

+0

Il n'y aura plus de conversion en Object []. Ce serait une erreur de compilation maintenant. – Thilo

+0

C'est bizarre. J'ai vu une première version de votre réponse où seulement la distribution 'List ' a été décrite, pas la nouvelle implémentation de la boucle for sans la conversion 'Object []' ... Mais je ne vois pas que vous avez édité votre réponse ... –

2

Mise en veille prolongée est retourner un tableau de String (aka une liste de type String)

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

Parce que votre requête renvoie une chaîne de noms de la table Company.

Qu'est-ce que vous avez à faire retourner une liste

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

Modifier votre erreur, de:

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

à ceci:

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

comme companyList.get(i) renvoie une chaîne.

Questions connexes