字符串不能转换为 DAO Receiver

Posted

技术标签:

【中文标题】字符串不能转换为 DAO Receiver【英文标题】:Strings can not be converted to DAO Receiver 【发布时间】:2019-08-15 17:17:12 【问题描述】:

我正在尝试使用列表对象执行批量插入操作,但在插入时,我无法将字符串转换为 DAO。迭代器循环中的接收器。

我试图列出列表对象,当时它正在打印列表中的值。但是,当我使用泛型是正常列表时,它显示错误,我没有找到任何插入的解决方案 通过这种方法,我正在读取 excel 文件并存储到列表中

public List collect(Receiver rec)
    
        //ReadFromExcel rd = new ReadFromExcel();
        List<String> up = new ArrayList<String>();
        //List<String> details = rd.reader();
        //System.out.println(details);
        try( InputStream fileToRead = new FileInputStream(new File(rec.getFilePath()))) 
         
            XSSFWorkbook  wb = new XSSFWorkbook(fileToRead);


            wb.setMissingCellPolicy(Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
            XSSFSheet sheet = wb.getSheetAt(0);
            DataFormatter fmt = new DataFormatter();
            String data ="";
            for(int sn = 0;sn<wb.getNumberOfSheets()-2;sn++)
            
                sheet = wb.getSheetAt(sn);
                for(int rn =sheet.getFirstRowNum();rn<=sheet.getLastRowNum();rn++)
                
                    Row row = sheet.getRow(rn);
                    if(row == null)
                    
                        System.out.println("no data in row ");

                    
                    else
                    
                        for(int cn=0;cn<row.getLastCellNum();cn++)
                        
                            Cell cell = row.getCell(cn);
                            if(cell == null)
                            
//                                System.out.println("no data in cell ");
//                                data = data + " " + "|";

                            
                            else
                            
                                String cellStr = fmt.formatCellValue(cell);
                                data = data + cellStr + "|";
                            
                        
                    
                
            
            up = Arrays.asList(data.split("\\|"));


           // System.out.println(details);             
                
                catch (FileNotFoundException ex) 
                
                Logger.getLogger(BImplementation.class.getName()).log(Level.SEVERE, null, ex);
                 
            catch (IOException ex) 
            
                Logger.getLogger(BImplementation.class.getName()).log(Level.SEVERE, null, ex);
             

        Iterator iter = up.iterator();
        while(iter.hasNext())
        
            System.out.println(iter.next());
        

        String row="";
        Receiver info = null;
        String cid = "";
        String cname = "";
        String address = "";
        String mid = "";
        boolean b = false;


        List<Receiver> res = new ArrayList<Receiver>();
        int c = 0;
        try
        
            String str = Arrays.toString(up.toArray()); 
           //System.out.println(str);
            String s = "";
            s = s + str.substring(1,str.length());
          // System.out.println("S:"+s);
            StringTokenizer sttoken = new StringTokenizer(s,"|");
            int count = sttoken.countTokens();
            while(sttoken.hasMoreTokens())
              
                if(sttoken.nextToken() != null)
                
//                    System.out.print(sttoken.nextToken());
                    cid = sttoken.nextToken();
                    cname = sttoken.nextToken();
                    address = sttoken.nextToken();
                    mid = sttoken.nextToken();


                info = new Receiver(cid,cname,address,mid);
                res.add(info);
               System.out.println("cid :"+cid+ "  cname : "+cname +"  address : "+address+" mid : "+mid);
                c = res.size();
            // System.out.println(c);
                
                else
                
                    break;

                
            
            System.out.println(count);
           // System.out.println("s");



         
            catch(NoSuchElementException ex)
            
                System.out.println("No Such Element Found Exception" +ex);
            
        return up;

        

我正在尝试使用这种方法插入数据库

public boolean insert(List res) 
    
        String sqlQuery = "insert into records(c_id) values (?)";
        DBConnection connector = new DBConnection();

        boolean flag = false;

//        Iterator itr=res.iterator();
//        while(it.hasNext())
//        
//            System.out.println(it.next());
//        
         try( Connection con = connector.getConnection();)
         
             con.setAutoCommit(false);        
             PreparedStatement pstmt = con.prepareStatement(sqlQuery);

              Iterator it = res.iterator();
              while(it.hasNext())
              
                Receiver rs =(Receiver) it.next();
                pstmt.setString(1,rs.getcID());            
                pstmt.setString(2,rs.getcName());
                pstmt.setString(3,rs.getAddress());
                pstmt.setString(4,rs.getMailID());
                pstmt.addBatch();  


                    
              int [] numUpdates=pstmt.executeBatch();
              for (int i=0; i < numUpdates.length; i++) 
              
                if (numUpdates[i] == -2)
                
                  System.out.println("Execution " + i +": unknown number of rows updated");
                  flag=false;
                
                else
                
                  System.out.println("Execution " + i + "successful: " + numUpdates[i] + " rows updated");
                  flag=true;
                
              
              con.commit();
             catch(BatchUpdateException b) 
            
              System.out.println(b);
              flag=false;
                   
            catch (SQLException ex) 
             
                Logger.getLogger(BImplementation.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println(ex);
                flag=false;
            
return flag;      
        

我想使用 JDBC 批量插入将列表对象插入到数据库中。

【问题讨论】:

字符串不是任何类型的接收器。该错误消息非常清楚为什么会抛出它。 泛型从 Java 5 开始就存在并且允许拥有类型安全的集合。 Java 5 于 2004 年问世。我们在 15 年后的 2019 年,您仍然使用原始 List 类型,因此显然会因此而出现运行时异常。不要使用原始类型。如果列表应该是接收者列表,那么它的类型应该是List&lt;Receiver&gt;,而不是List。它应该命名为receivers,而不是res 您在列表中存储了哪些对象?当您执行转换操作 (Receiver) it.next(); 时,它期望列表中的这个元素是一个 Receiver 对象。 请在您创建此列表的位置添加代码。 @Reynard 我更新了代码请检查一次 【参考方案1】:

您的方法 collect(Receiver rec) 返回名为 up 的字符串列表。

return up;

但是(如果您确实使用方法 collect 将 List 传递给 insert(List res) 方法),您希望此列表包含 Receiver 对象。这是不正确的,因为它 collect(..) 返回字符串列表。

当您尝试投射时会导致错误 Receiver rs =(Receiver) it.next();

您需要检查并修复您的代码,因此您将传递 Receiver 对象列表而不是字符串。

我真的建议您在使用 List 类的任何地方开始使用泛型。在这种情况下,编译器会立即显示所有数据类型错误。

【讨论】:

以上是关于字符串不能转换为 DAO Receiver的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为对象层次结构

ClassCastException:字符串不能转换为

为啥我不能在c中将字符串转换为int

字符串不能转换为 javax.jcr.Value

为啥不能使用 SqlFunctions 在 LinQ 中将 int 转换为字符串?

类型的值不能转换为字符串VB