SqlServer PrepareStatement устанавливает параметры для SQL 'в (?)' Статье
У меня есть sql
, который выглядит так:
SELECT * FROM T_TABLE WHERE ID IN(?)
Я хочу установить параметры для IN(?)
через PrepareStatement
. Я думаю, что желаемый метод будет выглядеть так:
prepareStatement.setList(1,Arrays.asList("1","2","3"));
Но я не знаю, какой метод следует использовать для достижения этого.
Я пробовал метод setArray
с помощью здесь, и я получил эти сообщения об ошибках.
java.sql.SQLFeatureNotSupportedException:
at com.microsoft.sqlserver.jdbc.SQLServerConnection.createArrayOf(SQLServerConnection.java:2763)
at com.newegg.ec.review.summary.dao.mssql.MSSQLReviewAccess.nextPage(MSSQLReviewAccess.java:165)
Означает ли это, что SqlService не поддерживает метод createArrayOf
? И теперь, как я могу достичь этого? Мне не нравится способ присоединиться к sql
следующим образом:
String sql = "SELECT * FROM T_TABLE WHERE ID IN("+in+")";
Мой код,
ps.setArray(1, conn.createArrayOf("VARCHAR",items.subList(1,9);
Любая помощь будет оценена.
С уважением.
Ответы
Ответ 1
В основном то, что вы хотите сделать, не возможно напрямую, используя PreparedStatement.
Посмотрите на эту замечательную статью, в которой показаны другие альтернативы
http://www.javaranch.com/journal/200510/Journal200510.jsp#a2
В качестве альтернативы вы можете использовать оператор createQuery, который будет принимать предложение IN в соответствии с
Параметр JPQL IN: Java-массивы (или списки, наборы...)?
Ответ 2
См. PreparedStatement.setInt
, который принимает индекс и значение параметра:
private String sqlParams(int numParams) {
StringBuilder sb = new StringBuilder();
if(numParams <= 0) return sb.toString();
for(int ctr = 0; ctr < numParams - 1; ++ctr) {
sb.append("?,");
}
sb.append("?");
return sb.toString();
}
/** In the method that accesses the DB... */
/** paramArray is an array of parameters for the IN clause. */
PreparedStatement preparedStatement = sqlObj.prepareStatement(
"SELECT * FROM T_TABLE WHERE ID IN(" + sqlParams(paramArray.length) + ")");
for(int idx = 0; idx < paramArray.length; ++idx) {
preparedStatement.setInt(idx, paramArray[idx]);
}
ResultSet rs = preparedStatement.executeQuery();