2013-05-04 56 views
2

我正在使用Hiberante連接到postgres數據庫。我正試圖向數據庫中插入一條記錄。我有一個字符串數組中的記錄值,我從csv文件中獲取。這是我的道代碼沒有指定參數1的值

StringBuffer query=new StringBuffer("insert into t_wonlist values("); 
     for(int i=0;i<67;i++){ 
      query.append(values[i]+","); 
     } 
     query.deleteCharAt(query.lastIndexOf(",")); 
     query.append(");"); 

     sessionfactory.getCurrentSession().createSQLQuery(query.toString()).executeUpdate(); 
     System.out.println("Query executed"); 
     sessionfactory.getCurrentSession().flush(); 

我正在使用StringBuffer,以便我可以使用for循環將值追加到查詢中。

但是當我執行查詢,我收到以下異常

org.postgresql.util.PSQLException: No value specified for parameter 1. 

我肯定參數的數量是正確的。有人能幫我嗎。謝謝

+1

請閱讀http://en.wikipedia.org/wiki/SQL_injection然後切換到使用參數化查詢(「準備語句」)。你永遠不需要用一個字符串生成器來構建一個簡單的插入查詢,這樣做危險地不安全 - 參見http://bobby-tables.com/。您需要顯示與該錯誤相對應的SQL的*確切文本*,如果您需要現在代碼的任何幫助。 – 2013-05-04 12:03:46

+1

其中一個'values [i]'s是一個問號,不是嗎? – dasblinkenlight 2013-05-04 12:06:11

+1

@dasblinkenlight ...並沒有被正確引用,可能。 – 2013-05-04 12:06:33

回答

4

你正以奇怪和倒退的方式接近這個。

即時問題可能是未能在其中一個輸入字符串中轉義/引用?,所以PgJDBC認爲它是查詢參數。這並不意味着你應該通過轉義/引用問號來修復它,這是一個你完全錯誤的方法。

請參閱this page on SQL injectionthis site

您正在使用Hibernate ORM,所以您通常會使用JPA接口或直接Hibernate接口來創建新的域對象並將其保留。典型的做法是以new爲對象,然後使用EntityManager.persist方法(如果使用JPA)或Session.save方法(如果使用Hibernate直接)來堅持實體。

如果您想要使用直接JDBC,應該創建一個JDBC PreparedStatement,設置其參數,然後應用它。見this tutorial。由於您正在加載CSV,您通常會在JDBC批處理中執行此操作,儘管這在PostgreSQL中實際上並沒有多大用處。

更好的是,由於您正在導入CSV,因此您可以使用PostgreSQL內置的COPY命令通過PgJDBC的CopyManager將這些更改有效地傳輸到目標表中。

相關問題