添加数组时出现PreparedStatment错误

问题描述:

我正在使用SPRING famework,并且当前正在尝试在创建新条目(行)时将数组添加到数据库中。有问题的列被称为“关键字”。因此,这里是我的SQL初始化代码(这看起来好像没什么问题)添加数组时出现PreparedStatment错误

CREATE TABLE IF NOT EXISTS Email (
    Email_Id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    Sender_Email VARCHAR(255) NOT NULL, 
    Recipient_Email VARCHAR(255) NOT NULL, 
    Subject VARCHAR(255) NOT NULL, 
    Body TEXT, 
    Attachment_Path VARCHAR(255) NOT NULL, 
    Creation_Date DATETIME NOT NULL, 
    MaxKeywords INT UNSIGNED NOT NULL, 
    Keywords VARCHAR(255) NOT NULL, 
    Primary Key(Email_Id) 
); 

这里是代码是崩溃和燃烧我的附加功能:

public boolean add(final MessageDto emailDto){ 
    boolean result = false; 
    int rowsAffected; 
    KeyHolder keyHolder = new GeneratedKeyHolder(); 
    final String sql; 

    sql = "INSERT INTO email (Sender_Email, Recipient_Email, Subject, Body, Attachment_Path, Creation_Date, MaxKeywords, Keywords) " + 
      "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; 

    try{ 
     rowsAffected = getJdbcTemplate().update(
        new PreparedStatementCreator() { 
         public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { 
          PreparedStatement statement = 
            connection.prepareStatement(sql, new String[] {"emailId"}); 

          String[] foo = {"A","B"}; 

          statement.setString(1, emailDto.getFrom()); 
          statement.setString(2, emailDto.getTo()); 
          statement.setString(3, emailDto.getSubject()); 
          statement.setString(4, emailDto.getBody()); 
          statement.setString(5, emailDto.getAttachmentPath()); 
          statement.setTimestamp(6, new Timestamp(emailDto.getCreationDate().getMillis())); 
          statement.setInt(7, emailDto.getMaxKeywordCount()); 
          statement.setArray(8, connection.createArrayOf("varchar", foo)); 

          return statement; 
         } 
         }, keyHolder); 

     if(rowsAffected > 0){ 
      emailDto.setEmailId(keyHolder.getKey().intValue()); 
      result = true; 
     } 
    } catch (Exception e){ 
     throw new RuntimeException(e); 
    } 

    return result; 
} 

抛出的错误是:

org.springframework.dao.InvalidDataAccessApiUsageException: PreparedStatementCallback; SQL []; null; nested exception is java.sql.SQLFeatureNotSupportedException 

帮助?

+0

它说类型是不正确的 - 它想要一个了java.sql.Array – JMH 2013-03-21 22:22:38

+0

此链接可以帮助你.. [PreparedStatement的SET数组(http://www.java2s.com/Code/Java /Database-SQL-JDBC/PreparedStatementSetArray.htm) – Smit 2013-03-21 22:30:19

+0

不是忘恩负义@Smit,但Spring似乎并不知道oracle,所以我不能导入或使用它...这不是java/spring的内置部分? – JMH 2013-03-21 22:38:23

如果您决定放弃setArray方法,您可以这样做。使用您自己的逻辑将数组转换为字符串。无论如何,您将它存储在varchar中,因此您必须“平整”阵列。

String[] foo = {"A","B"}; 
    StringBuilder sb = new StringBuilder(); 
    for (String bar : foo) { 
     sb.append(bar); 
     sb.append("\t"); 
    } 
    statement.setArray(8, sb.toString());