2013-03-21 3 views
4

Я использую домашнюю страницу SPRING, и в настоящее время я пытаюсь добавить массив в свою базу данных при создании новой записи (строки). Эта колонка называется «Ключевые слова». Так вот мой код инициализации SQL (который выглядит хорошо для меня)PreparedStatment Error при добавлении массива

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

+0

Эта ссылка может помочь вам .. [PreparedStatement Set массива] (http://www.java2s.com/Code/Java /Database-SQL-JDBC/PreparedStatementSetArray.htm) – Smit

+0

Не быть неблагодарным @Smit, но Spring, похоже, не знает о oracle, поэтому я не могу его импортировать или использовать ... это не встроенная часть java/spring ? – JMH

ответ

0

Если вы решили отказаться от метода 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());