在准备好的语句中设置一行 null

set a row in prepared statement null

    if(article.getAttribut() == null ) {
        preparedStatement = initialisationRequetePreparee(connexion,
                SQL_INSERT, true, article.getProduit().getId(), null ,
                article.getDesignationArticle(), article.getArticleParent().getId());
    } else {
            preparedStatement = initialisationRequetePreparee(connexion,
                    SQL_INSERT, true, article.getProduit().getId(), article
                    .getAttribut().getId(),
                    article.getDesignationArticle(), article.getArticleParent().getId());
    }

我的问题是如何在 null 上设置 article.getAttribut().getId() 因为我遇到了这个错误

Caused by: java.sql.SQLException: Parameter index out of range (4 > number of parameters, which is 3).

PreparedStatement初始化RequetePreparee方法

public static PreparedStatement initialisationRequetePreparee( Connection connexion, String sql, boolean returnGeneratedKeys, Object... objets ) throws SQLException {
        PreparedStatement preparedStatement = connexion.prepareStatement( sql, returnGeneratedKeys ? Statement.RETURN_GENERATED_KEYS : Statement.NO_GENERATED_KEYS );
        for ( int i = 0; i < objets.length; i++ ) {
            preparedStatement.setObject( i + 1, objets[i] );
        }
        return preparedStatement;
    }

PreparedStatement中有一个方法

void setNull(int parameterIndex, int sqlType) throws SQLException

您可以使用该方法将值设置为 null

注意:你的错误是不同的。与null如何设置值无关,而是与需要设置的参数个数有关。 您的参数似乎少于您尝试设置的实际值的数量!参数的数量等于查询中存在的 ? 的数量。可能您的查询中只有 3 个问号,而您正在设置第 4 个(不存在的)值。

我想 SQL_INSERT 有不同的 sql 如果 article.getAttribut()null 或不是。如果是这种情况,您不能使用单个 initialisationRequetePreparee。您需要两个函数,或者您需要 initialisationRequetePreparee 的内部逻辑,类似于以下内容:

PreparedStatement ps = ...

if (articleAttribute == null) {
    // 3 ps.set functions
} else {
    // 4 ps.set functions
}
return ps;