En Java, j'essaie de tester une valeur nulle, à partir d'un ResultSet, où la colonne est convertie en un type int primitif .
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
D'après le fragment de code ci-dessus, existe-t-il une meilleure façon de le faire, et je suppose que le deuxième test wasNull () est redondant?
Renseignez-nous et merci
IF(colName = NULL, 0, colName) AS colName
dans laSELECT
déclaration (de préférence dans un proc stocké). D'un point de vue philosophique, cela revient à déterminer si la base de données doit être conforme à l'application, ou vice versa. Étant donné que SQL gère facilement les valeurs NULL et que de nombreux consommateurs SQL ne le font pas (c'est-à-direjava.sql.ResultSet
), je choisis de le gérer au niveau de la base de données lorsque cela est possible. (Ceci, bien sûr, suppose que conceptuellement NULL et zéro sont équivalents pour vos besoins.)Réponses:
La valeur par défaut
ResultSet.getInt
lorsque la valeur du champNULL
est de retourner0
, qui est également la valeur par défaut de votreiVal
déclaration. 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:
(Modifié sous les commentaires @martin ci-dessous; le code OP tel qu'il est écrit ne se compilera pas car il
iVal
n'est pas initialisé)la source
getInt()
devrait êtregetInteger()
ce qui renvoie unInteger
qui estnull
si la valeur DB estnull
. Les développeurs ont vraiment foiré celui-ci.0
et ceNULL
sont deux choses très différentesUne autre solution:
la source
Je pense que c'est redondant.
rs.getObject("ID_PARENT")
doit renvoyer unInteger
objet ounull
, si la valeur de la colonne était réellementNULL
. Il devrait donc même être possible de faire quelque chose comme:la source
getObject
ne retourne pas nécessairement un entier, en raison de la nature du type de colonne dans la base de données Oracle que j'utilise ("Number").Types.BIGINT
(qui devrait être mappé sur aLong
), lagetObject()
méthode retourne 0 au lieu de null.rs.getObject("ID_PARENT", Integer.class)
Vérifiez simplement si le champ
null
utilise ou nonResultSet#getObject()
. Remplacez-1
par la valeur de casse nulle souhaitée.Ou, si vous pouvez garantir que vous utilisez le bon type de colonne de base de données de manière à ce
ResultSet#getObject()
qu'il renvoie vraiment unInteger
(et donc pasLong
,Short
ouByte
), vous pouvez également le transtyper en unInteger
.la source
AFAIK, vous pouvez simplement utiliser
même si c'est NULL.
la source
Juste une mise à jour avec Java Generics.
Vous pouvez créer une méthode utilitaire pour récupérer une valeur facultative de tout type Java à partir d'un ResultSet donné, préalablement casté.
Malheureusement, getObject (columnName, Class) ne renvoie pas null, mais la valeur par défaut pour le type Java donné, donc 2 appels sont requis
Dans cet exemple, votre code pourrait ressembler à ci-dessous:
Heureux d'avoir des commentaires
la source
Vous pouvez appeler cette méthode à l'aide de resultSet et du nom de colonne de type Number. Il retournera soit la valeur entière, soit null. Aucun zéro ne sera retourné pour la valeur vide dans la base de données
la source
Avec java 8, vous pouvez faire ceci:
Dans ce cas, vous vous assurez que le nVal sera nul (et non nul) si la valeur SQL est NULL
la source
resultSet.getInt("col_name")
if (rs.wasNull())
Pour plus de commodité, vous pouvez créer une classe wrapper autour de ResultSet qui renvoie des valeurs nulles alors que
ResultSet
ce n'est généralement pas le cas.la source
Une autre bonne façon de vérifier, si vous avez le contrôle du SQL, est d'ajouter une valeur par défaut dans la requête elle-même pour votre colonne int. Vérifiez ensuite cette valeur.
par exemple pour une base de données Oracle, utilisez NVL
puis vérifier
Bien sûr, cela est également sous l'hypothèse qu'il existe une valeur qui ne serait normalement pas trouvée dans la colonne.
la source