2015-07-10 1 views
2

Я пишу веб-службу RESTful для вставки динамической таблицы в базу данных. Я ошибаюсь где-то в этом, и он не работает, что я пытаюсь сделать. может кто-нибудь, пожалуйста, выяснить и исправить меня, где я делаю неправильно?Служба REST для создания динамической таблицы в базе данных из Hibernate

Настойчивость класс:

public void createTable(String tableName, List<String> columns, List<String> datatypes) { 

     StringBuilder createTableQuery = new StringBuilder("CREATE TABLE IF NOT EXISTS `" + tableName + "` ("); 
      columns = new ArrayList<>(); 


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

       createTableQuery.append("`" + columns + "` "); 
       createTableQuery.append(datatypes + ", "); 
      } 

      //To replace last ',' character and place the bracket. 
      createTableQuery.replace(createTableQuery.lastIndexOf(","),createTableQuery.length(), ")"); 
     eTableQuery); 

      Session session = null; 
      Transaction transaction = null; 
      try { 

       session = HibernateUtil.getSessionFactory().getCurrentSession(); 
       transaction = session.beginTransaction(); 
       int count = session.createSQLQuery(createTableQuery.toString()).executeUpdate(); 

       transaction.commit(); 
      } catch (Exception ex) { 
       transaction.rollback();   
      } 
    }  

Класс обслуживания:

@POST 
    @Path("/selfbi/addtable") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response createTable(JSONObject jsonObject, @QueryParam("uniqueid") String uniqueid, @QueryParam("sheetname") String sheetname) throws JSONException { 
     Response res = null; 
     try{ 
     String tableName = ""; 
     if(jsonObject.has("tableName")){ 
      tableName = jsonObject.getString("tableName"); 
     } 

     JSONArray jsonArray = jsonObject.getJSONArray("columns"); 

     List<String> col = new ArrayList<String>(); 
      if (jsonArray != null) { 
      for (int i=0;i<jsonArray.length();i++) { 
       col.add(jsonArray.getString(i));  
      } 
     } 


     JSONArray json = jsonObject.getJSONArray("datatypes"); 
     List<String> dtype = new ArrayList<String>(); 
     if (json != null) { 
      for (int i=0;i<json.length();i++) { 
       dtype.add(json.getString(i)); 
      } 
     } 


     restService.createTable(tableName, col, dtype); 



     res = Response.status(Status.CREATED).build(); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     System.out.println("service------>>>"+res); 
     return res; 
    } 

ERROR в консоли:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
    at java.lang.AbstractStringBuilder.replace(AbstractStringBuilder.java:789) 
    at java.lang.StringBuilder.replace(StringBuilder.java:266) 
    at com.acinfotech.timebound.jpa.service.ReportJobsPersistenceServiceImpl.createTable(ReportJobsPersistenceServiceImpl.java:7843) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at com.sun.proxy.$Proxy81.createTable(Unknown Source) 
    at com.acinfotech.timebound.restservice.service.RestServiceImpl.createTable(RestServiceImpl.java:2751) 
    at com.acinfotech.timebound.restservice.service.RestrsService.createTable(RestrsService.java:428) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 

Если вы не хотите, чтобы ответить, пожалуйста, игнорировать его вместо первоначального голосования/блокировки Это.

+0

я не уверен, если это является причиной вашей ошибки (вероятно, нет), но при добавлении определения столбцов, убедитесь, чтобы добавить текущий элемент из '' columns' и datatypes' список в 'StringBuilder', а не сами списки. – mthmulders

ответ

2

Проблема может быть вызвана тем, что вы повторно назначили переменную columns новым, пустым ArrayList. Это означает, что никакие столбцы не будут добавлены в запрос, и такой lastIndexOf() вернет -1.

+0

Да, вы правы. Любое предложение кода для его решения? – arch

+0

Как насчет удаления оператора 'columns = new ArrayList <>();'? – mthmulders

+0

Оскорбительный оператор находится в методе 'createTable' класса persistence; он повторно назначает один из своих входных параметров новый (и, следовательно, пустой) список. Маркировка параметра метода 'final' гарантирует, что повторное присвоение, между прочим, невозможно. – mthmulders

1

Замена последней запятой на кронштейн не будет работать, если columns.size() равен нулю. Сделайте что-то вроде:

if (columns.size() > 0){ 
createTableQuery.replace(createTableQuery.lastIndexOf(","),createTableQuery.length(), ")"); 
}