2012-12-19 26 views
-1

我試圖做一個自動遞增函數,每次用戶創建表Departmenent_id(varchar)遞增,並且我給了A1,A2 .....我所做的我的自動增量(),我使用的列表,從select Dept_id from Department得到的結果,並嘗試從這個整數部分分開,並添加到TreeSet收集和取出最大的元素,並添加到字符串的第一部分,但問題時,我面對當我拿出子字符串像9這樣的字符串,並將其解析爲整數im得到number format exception。爲什麼會出現這個問題,我的功能代碼就在這裏數字格式異常,同時轉換子串部分

private String autoIncreament() { 
    String id = null; 
    String num = null; 
    String result = "SELECT DEPARTMENT_ID FROM Department"; 
    TreeSet<Integer> treeSet = new TreeSet<Integer>(); 
    List<Map<String, Object>> result1 = getJdbcTemplate().queryForList(
      result); 
    for (Map<String, Object> map : result1) { 
     id = (String) map.get("DEPARTMENT_ID"); 
     System.out.println("id=" + id); 
     num = id.substring(1); 
     int number = Integer.parseInt(num); 
     treeSet.add(number); 

    } 

    Integer in = treeSet.pollLast(); 
      int c=in.intValue(); 
       c++; 
    id = id +c ; 
    /* System.out.println("jcak="+rowSet.getRow()); */ 
    return id; 
} 

我的異常細節

19 Dec, 2012 11:25:14 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing org[email protected]5d764be1: startup date [Wed Dec 19 11:25:14 IST 2012]; root of context hierarchy 
19 Dec, 2012 11:25:14 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [mybeans.xml] 
19 Dec, 2012 11:25:14 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]7b5a6029: defining beans [dataSource,employeeDaoImpl,departmentdao]; root of factory hierarchy 
19 Dec, 2012 11:25:14 AM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName 
INFO: Loaded JDBC driver: com.mysql.jdbc.Driver 
[email protected] 
id=9 
Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at com.nousinfo.tutorial.employee.dao.impl.DepartmentDAOImpl.autoIncreament(DepartmentDAOImpl.java:113) 
    at com.nousinfo.tutorial.employee.dao.impl.DepartmentDAOImpl.getDepartment(DepartmentDAOImpl.java:47) 
    at AccessClass.main(AccessClass.java:34) 
+0

你確定你只提取數字? – Smit

+0

這不是遞增序列號的好邏輯。爲ID生成器使用單獨的表格。如果你使用JPA,你可以使用TableGenerator – vels4j

+0

你可以有一個Table IDGenerator的列1.TableName 2.LastSeqNumber。每當添加新行時增加最後一個seq編號 – vels4j

回答

0

如果您使用的是正常的jdbc,java提供了讀取密鑰的支持。

connection = getConnection(); 
String sql = "insert into table1 (col1,Rcol2) values (?, ?)"; 
ps = connection.prepareStatement(sql, new String[] {"colKEY"}); 
ps.setString(1, col1Val); 
ps.setString(2, col2Val); 
ps.executeUpdate();  

rs = ps.getGeneratedKeys(); 
if (rs.next()){ 
    colKey = new Integer(rs.getInt(1)); 
} 
connection.commit(); 

希望這會有所幫助。

+0

我不使用正常的jdbc我使用彈簧 – henrycharles

1

這可能是導致NumberFormatException的線路。

int number = Integer.parseInt(num); 

,看看有什麼地方出了錯最簡單的方法是這樣的行之前打印num,它可能不是一個數字。

編輯(問題修改後) - 空字符串(「」)不能轉換爲整數。

在附註中,您可以爲任何嚴重的用例/應用程序生成ID生成器。

0

例外說明了一切:在線程

異常 「主要」 java.lang.NumberFormatException:對於輸入字符串: 「」

你正在試圖解析空字符串爲int

如果您的輸入字符串爲9並且您從索引1獲取子字符串,您將獲得空字符串

0
num = id.substring(1); 

it shows start index from 1. If your value is "7" then it will get "". 

更改它

num = id.substring(0);   

try{ 
     int number = Integer.parseInt(num); 

} catch (NumberFormatException ex) { 
    ex.printStackTrace(); 
    } 
+0

由於OP顯示的值爲'9',所以這篇文章的描述顯然是誤導。 – SRy

0

問題是你不能犯序列號前綴。只需以下邏輯可以這樣幫助你

  1. Department行獲取數由"select count(*) from department"
  2. 然後return "A"+(numberOfRows+1) ;