SQLException: для параметра 1 Не задано значение
Я столкнулся со следующей ошибкой при выполнении моего приложения:
[5]}Java.язык SQL.SQLException: для параметра 1 не задано значение
Что это значит?
Мой UserGroup
список в моем Дао:
public List<UsuariousGrupos> select(Integer var) {
List<UsuariousGrupos> ug= null;
try {
conn.Connection();
stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo ='" + var + "'");
ResultSet rs = stmt.executeQuery();
ug = new ArrayList<UsuariousGrupos>();
while (rs.next()) {
ug.add(getUserGrupos(rs));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
conn.Disconnected();
}
return ug;
}
public UsuariousGrupos getUserGrupos(ResultSet rs) {
try {
UsuariousGrupos ug = new UsuariousGrupos(rs.getInt("id_usuario"), rs.getInt("id_grupo"));
return ug;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
Мой список групп пользователей в моем управляемом Бобе:
public List<UsuariousGrupos> getListOfUserGroups() {
List<UsuariousGrupos> usuariosGruposList = userGrpDAO.select(var2);
listOfUserGroups = usuariosGruposList;
return listOfUserGroups;
}
Моя страница JSF:
<p:dataTable var="usergroups" value="#{usuariousGruposBean.listOfUserGroups}">
<p:column headerText="" style="height: 0" rendered="false">
<h:outputText value="#{usergroups.id_grupo}"/>
</p:column>
Моя таблица данных может отображать список групп из базы данных. Однако, когда я выбираю отдельную строку в таблице данных, это занимает некоторое время для приложения установить соединение с моей базой данных, чтобы отобразить выбранный результат.
Также странно, что приложение способно отображать определенные выбранные результаты быстрее, чем другие. Имеет ли это какое-то отношение к тому исключению, на которое я указал в самом начале?
Ошибка:
Disconnected
Connected!!
java.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2462)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2216)
at br.dao.UsuariousGruposDAO.select(UsuariousGruposDAO.java:126)
at br.view.UsuariousGruposBean.getListOfUserGroups(UsuariousGruposBean.java:54)
SEVERE: Error Rendering View[/index.xhtml]
javax.el.ELException: /index.xhtml @61,99 value="#{usuariousGruposBean.listOfUserGroups}": Error reading 'listOfUserGroups' on type br.view.UsuariousGruposBean
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
3 ответа:
Нет такого метода, как
Connection()
иgetPreparedStatement()
наjava.sql.Connection
.conn.Connection(); stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo ='" + var + "'");
Вы, вероятно, не хотите этого слышать, но ваш подход JDBC полностью сломан. Эта конструкция указывает, что JDBC
conn
явно является доморощенной оболочкой вокруг кода JDBC. Ваша конкретная проблема, вероятно, вызвана кодом, стоящим за методомgetPreparedStatement()
. Это, по-видимому, добавление?
к строке SQL перед делегированием через realconnection.prepareStatement()
метод.Connection
является держите в качестве статической или переменной экземпляра, которая является threadunsafe .Вам нужно полностью переписать его так, чтобы он сводился к следующему правильному использованию и области видимости переменных:
public List<UsuariousGrupos> select(Integer idGrupo) throws SQLException { Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; List<UsuariousGrupos> usuariousGrupos = new ArrayList<UsariousGrupos>(); try { connection = database.getConnection(); statement = connection.prepareStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo = ?"); statement.setInt(1, idGrupo); resultSet = statement.executeQuery(); while (resultSet.next()) { usuariousGrupos.add(mapUsuariousGrupos(resultSet)); } } finally { if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {} if (statement != null) try { statement.close(); } catch (SQLException ignore) {} if (connection != null) try { connection.close(); } catch (SQLException ignore) {} } return usuariousGrupos; }
См. также:
Не имея отношения к конкретному вопросу, у вас есть еще одна проблема. Следующее исключение
Явакс.эль.ELException: / index.в XHTML @61,99 value= " #{usuariousGruposBean.listOfUserGroups}": Ошибка чтения 'listOfUserGroups' по типу br.вид.UsuariousGruposBean
Указывает на то, что вы делаете JDBC вещи внутри метода getter вместо (post)конструктора или (action)метода прослушивателя. Это также очень плохая идея, потому что геттер может быть вызван несколько раз во время отклика рендеринга. Исправьте это соответствующим образом.
См. также:
Обычно вы получаете такого рода ошибку, когда используете готовые операторы и забыли задать параметр с индексом 1.
В этом случае вы используете готовые операторы, но готовить нечего, вы делаете строку запроса вручную.
Кроме того, вы можете столкнуться с дополнительными проблемами, потому что вы объединяете
Integer
между апострофами. Числовые значения идут без них.Итак, это должно быть так:
stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo = " + var + ";");
Но на самом деле вы должны использовать что-то вроде getStatement () или используйте getPreparedStatement() правильно (поместите a ? в позиции
var
и setInteger (), чтобы поместить его в.Таким образом, окончательное решение будет следующим:
stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo = ?;"); stmt.setInt(1, var);