Java 添加数组时出现PreparedStation错误
我正在使用SpringFamework,当前我正在尝试在创建新条目(行)时向数据库添加一个数组。讨论中的列称为“关键字”。下面是我的sql初始化代码(我觉得很好) 下面是我的add函数中正在崩溃和燃烧的代码:Java 添加数组时出现PreparedStation错误,java,sql,arrays,spring,Java,Sql,Arrays,Spring,我正在使用SpringFamework,当前我正在尝试在创建新条目(行)时向数据库添加一个数组。讨论中的列称为“关键字”。下面是我的sql初始化代码(我觉得很好) 下面是我的add函数中正在崩溃和燃烧的代码: public boolean add(final MessageDto emailDto){ boolean result = false; int rowsAffected; KeyHolder keyHolder = new GeneratedKeyHolder
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此链接可能会帮助您。。并非不领情@Smit,但Spring似乎并不了解oracle,所以我无法导入或使用它。。。这不是java/spring的内置部分吗?您使用的是哪个数据库以及哪个驱动程序版本?看起来驱动程序不支持setArray@Jessermon-是的,到目前为止,我的最佳想法是将其转换为JSON字符串,并存储该字符串。。。但我感觉到某种道德上的“必须工作”的感觉
String[] foo = {"A","B"};
StringBuilder sb = new StringBuilder();
for (String bar : foo) {
sb.append(bar);
sb.append("\t");
}
statement.setArray(8, sb.toString());