web-dev-qa-db-fra.com

Vérification de la valeur null int à partir d'un Java ResultSet

Dans Java, j'essaie de tester une valeur null, à partir d'un ResultSet, dans lequel la colonne est convertie en primitive int type.

int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
  if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
    iVal = rs.getInt("ID_PARENT");
  }
}

À partir du fragment de code ci-dessus, existe-t-il une meilleure façon de procéder, et je suppose que le second wasNull () test est redondant?

Nous éduquer, et merci

257
ian_scho

La valeur par défaut pour ResultSet.getInt lorsque la valeur du champ est NULL est de renvoyer 0, qui est également la valeur par défaut de votre déclaration iVal. Dans ce cas, votre test est complètement redondant.

Si vous voulez réellement faire quelque chose de différent si la valeur du champ est NULL, je suggère:

int iVal = 0;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
    iVal = rs.getInt("ID_PARENT");
    if (rs.wasNull()) {
        // handle NULL field value
    }
}

(Edité en tant que commentaires @martin ci-dessous; le code OP tel qu'il est écrit ne serait pas compilé car iVal n'est pas initialisé.)

339
Richard

Une autre solution:

public class DaoTools {
    static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {
        int nValue = rs.getInt(strColName);
        return rs.wasNull() ? null : nValue;
    }
}
79
Patrice IMBERT

Je pense que c'est redondant. rs.getObject("ID_PARENT") devrait renvoyer un objet Integer ou null, si la valeur de la colonne était réellement NULL. Donc, il devrait même être possible de faire quelque chose comme:

if (rs.next()) {
  Integer idParent = (Integer) rs.getObject("ID_PARENT");
  if (idParent != null) {
    iVal = idParent; // works for Java 1.5+
  } else {
    // handle this case
  }      
}
28
Andreas_D

Il suffit de vérifier si le champ est null ou de ne pas utiliser ResultSet#getObject() . Remplacez -1 par n'importe quelle valeur de casse nulle.

int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;

Ou, si vous pouvez garantir que vous utilisez le type de colonne de base de données correct, de sorte que ResultSet#getObject() renvoie réellement un Integer (et donc pas Long, Short ou Byte), peut aussi simplement le transtyper en Integer.

Integer foo = (Integer) resultSet.getObject("foo");
25
BalusC

Autant que vous pouvez utiliser simplement

iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
  // do somthing interesting to handle this situation
}

même si c'est NULL.

9
Peter Tillemans

Juste une mise à jour avec Java Generics.

Vous pouvez créer une méthode utilitaire pour extraire une valeur facultative de tout type Java à partir d'un ResultSet donné, précédemment converti.

Malheureusement, getObject (columnName, Class) ne renvoie pas la valeur null, mais la valeur par défaut pour le type donné Java; deux appels sont donc nécessaires.

public <T> T getOptionalValue(final ResultSet rs, final String columnName, final Class<T> clazz) throws SQLException {
    final T value = rs.getObject(columnName, clazz);
    return rs.wasNull() ? null : value;
}

Dans cet exemple, votre code pourrait ressembler à celui ci-dessous:

final Integer columnValue = getOptionalValue(rs, Integer.class);
if (columnValue == null) {
    //null handling
} else {
    //use int value of columnValue with autoboxing
}

Heureux d'avoir des retours

4
luchoct

Vous pouvez appeler cette méthode à l'aide de resultSet et du nom de colonne de type Number. Il retournera la valeur Integer ou null. Aucun zéros ne sera renvoyé pour une valeur vide dans la base de données.

private Integer getIntWithNullCheck(ResultSet rset, String columnName) {
    try {
        Integer value = rset.getInt(columnName);
        return rset.wasNull() ? null : value;
    } catch (Exception e) {
        return null;
    }
}
1
amine kriaa

Pour plus de commodité, vous pouvez créer une classe wrapper autour de ResultSet qui renvoie des valeurs NULL alors que ResultSet ne le ferait pas normalement.

public final class ResultSetWrapper {

    private final ResultSet rs;

    public ResultSetWrapper(ResultSet rs) {
        this.rs = rs;
    }

    public ResultSet getResultSet() {
        return rs;
    }

    public Boolean getBoolean(String label) throws SQLException {
        final boolean b = rs.getBoolean(label);
        if (rs.wasNull()) {
            return null;
        }
        return b;
    }

    public Byte getByte(String label) throws SQLException {
        final byte b = rs.getByte(label);
        if (rs.wasNull()) {
            return null;
        }
        return b;
    }

    // ...

}
1
Jacob Crofts

Avec Java 8, vous pouvez faire ceci:

Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                    .map(BigDecimal::longValue).orElse(null));

Dans ce cas, vous vous assurez que nVal sera nul (et non nul) si la valeur SQL est NULL

1
George