SQLException: для параметра 1 не указано значение

При выполнении приложения я столкнулся со следующей ошибкой:

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)

person ShaunK    schedule 18.11.2011    source источник
comment
в какой строке возникает ошибка?   -  person oers    schedule 18.11.2011
comment
ошибка возникает в этих двух строках: ResultSet rs = stmt.executeQuery(); и List‹UsuariousGrupos› usuariosGruposList = userGrpDAO.select(var2);   -  person ShaunK    schedule 18.11.2011
comment
Вы уверены, что ваш выбор не является выбором id_usuario, id_grupo из usuarios_grupos, где id_grupo = ?. Это объясняет отсутствующее значение параметра 1.   -  person oers    schedule 18.11.2011
comment
хм, я действительно попробовал это, и я получаю следующую ошибку.   -  person ShaunK    schedule 18.11.2011
comment
новая ошибка кажется новой проблемой. Возможно, вам следует открыть для этого отдельный вопрос и принять решение для исключения sql здесь.   -  person oers    schedule 18.11.2011


Ответы (5)


Нет такого метода, как Connection() и getPreparedStatement() в java.sql.Connection.

conn.Connection();
stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo ='" + var + "'");

conn явно является доморощенной оболочкой кода JDBC. Ваша конкретная проблема, вероятно, вызвана кодом метода getPreparedStatement(). Очевидно, он добавляет ? к строке SQL перед делегированием реальному connection.prepareStatement().

Вы, вероятно, не хотите это слышать, но ваш подход JDBC полностью сломан. Этот дизайн указывает, что JDBC Connection хранится как статическая переменная или переменная экземпляра, что является небезопасным для потоков.

Вам нужно полностью переписать его, чтобы он сводился к следующему правильному использованию и области видимости переменных:

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;
}

Смотрите также:


Не связанный с конкретным вопросом, у вас другая проблема. Следующее исключение

javax.el.ELException: /index.xhtml @61,99 value="#{usuariousGruposBean.listOfUserGroups}": Ошибка чтения 'listOfUserGroups' для типа br.view.UsuariousGruposBean

указывает, что вы делаете вещи JDBC внутри метода getter вместо (post)constructor или (action)listener метода. Это также очень плохая идея, потому что геттер может вызываться более одного раза во время ответа рендеринга. Исправьте это соответствующим образом.

Смотрите также:

person BalusC    schedule 18.11.2011
comment
Эй, спасибо за информацию и помощь! Я прохожу это сейчас. Извините, я новичок в разработке веб-приложений JDBC и Java. - person ShaunK; 18.11.2011

Обычно вы получаете такую ​​ошибку при использовании подготовленных операторов и забыли установить параметр с индексом 1.

В этом случае вы используете подготовленные операторы, но готовить нечего, вы создаете строку запроса вручную.

Кроме того, вы можете столкнуться с дополнительными проблемами, потому что вы объединяете Integer между апострофами. Числовые значения идут без них.

Итак, должно быть так:

stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo = " + var + ";");

Но на самом деле вы должны использовать что-то вроде getStatement() или правильно использовать getPreparedStatement() (поместите ? в позицию var и setInteger(), чтобы поместить его.

Таким образом, окончательное решение будет таким:

stmt = conn.getPreparedStatement("select id_usuario, id_grupo from usuarios_grupos where id_grupo = ?;");
stmt.setInt(1, var);
person Raidok    schedule 18.11.2011
comment
Эй, да, я попробовал то, что вы предложили. Однако теперь я получаю исключение нулевого указателя. - person ShaunK; 18.11.2011
comment
Не помешает создать подготовленный оператор без заполнителей. - person BalusC; 18.11.2011

Если вы используете

stmt = conn.getPreparedStatement("select id_usuario, id_grupo 
  from usuarios_grupos 
  where id_grupo = ?);

Вы должны

stmt.setInt(1, var);

до

ResultSet rs = stmt.executeQuery();

Чтобы присвоить значение первому параметру (т.е. параметру 1). Если не произойдет ваше исключение.

person oers    schedule 18.11.2011
comment
СЕРЬЕЗНЫЙ: Ошибка рендеринга View[/index.xhtml] javax.el.ELException: /index.xhtml @61,99 value=#{usuariousGruposBean.listOfUserGroups}: Ошибка чтения 'listOfUserGroups' для типа br.view.UsuariousGruposBean на com.sun .faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114) в javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) в javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) ) - person ShaunK; 18.11.2011
comment
хорошо, var2 - это мой выбранный идентификатор, когда я выбираю строку. Я пытаюсь передать его в свой метод select (Int var) в dao. - person ShaunK; 18.11.2011

Недавно я также столкнулся с этой проблемой, в моем случае я использовал метод пакетного обновления jdbcTemplate для пакетной вставки записей.

void batchInsert(final List<EntryDataDO> doList) {
    jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            final EntryDataDO dataDO = doList.get(i);
            if (dataDO == null){
                return;
            }
            ps.setString(1, dataDO.getId());
            ps.setString(2, dataDO.getDataCode());
            ...
        }

        @Override
        public int getBatchSize() {
            return doList.size();
        }
    });
}

Причина в том, что если первый элемент doList имеет значение null, и он будет напрямую возвращен, и это вызовет Caused by: java.sql.SQLException: No value specified for parameter 1, но если не первый элемент имеет значение null, пакетное обновление в порядке, но записи будут дублироваться, например. второй элемент равен нулю, второй будет дублировать первую запись

insert into t (id,...) values (1,...),(1,...),(3,...)

Таким образом, решение: 1. сначала исключить нулевой элемент из doList 2. затем вызвать batchInsert(doListWithoutNull), то есть: нельзя исключить внутренний элемент org.springframework.jdbc.core.BatchPreparedStatementSetter#setValues

person zhuguowei    schedule 04.01.2020

ResultSet rs = stmt.executeQuery();

Не используйте эту строку до выполнения операции.

person Gautam Singh Rajput    schedule 13.05.2020
comment
можно использовать ResultSet rs=new stmt.getResultSet(); только метод не выполняет запрос() - person Gautam Singh Rajput; 13.05.2020