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
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é.)
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;
}
}
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
}
}
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");
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.
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
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;
}
}
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;
}
// ...
}
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