添加数组时出现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
帮助?
答
如果您决定放弃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());
它说类型是不正确的 - 它想要一个了java.sql.Array – JMH 2013-03-21 22:22:38
此链接可以帮助你.. [PreparedStatement的SET数组(http://www.java2s.com/Code/Java /Database-SQL-JDBC/PreparedStatementSetArray.htm) – Smit 2013-03-21 22:30:19
不是忘恩负义@Smit,但Spring似乎并不知道oracle,所以我不能导入或使用它...这不是java/spring的内置部分? – JMH 2013-03-21 22:38:23