Jdbi: Valeur row.wasNull non mise à jour

Créé le 15 oct. 2018  ·  5Commentaires  ·  Source: jdbi/jdbi

Hey, j'ai attrapé une affaire louche. Le bean dans BeanMapper a NULL au lieu de la valeur byte[].

Table de base de données MySQL :

b_column varchar(10), /* value = NULL */
c_column longblob, /* value = some value */

Objet Java :

String b_column; // NULL - it's okay
byte[] c_column; // NULL - why?

Comme j'ai débogué BuiltInMapperFactory :

private static <T> ColumnMapper<T> referenceMapper(ColumnGetter<T> getter) {
    return (r, i, ctx) -> {
        T value = getter.get(r, i); // value = byte[..] - not null, it's okay
        return r.wasNull() ? null : value; // r.wasNull() = true - why true?
    };
}

Si je mets la valeur b_column, cela fonctionne bien.

Quelqu'un peut-il expliquer ce cas s'il vous plaît?
Version : org. jdbi:jdbi3-core :3.5.1

Tous les 5 commentaires

Le r est un ResultSet, qui AFAIK provient de votre bibliothèque de base de données jdbc... Donc, s'il se comporte mal, je pense que le problème réside là-dedans. À vue, ce code dans jdbi me semble bien, bien que l'utilisation de wasNull au lieu de simplement == null soit un peu étrange à mon avis. Peut-être pour gérer quelque chose comme Null Objects où une vérification null régulière vous induirait en erreur.

referenceMapper est utilisé pour les primitives enveloppées comme Integer.class . JDBC ResultSet ne fournit qu'une méthode getInt(column) , qui renvoie une primitive int . Si la colonne est nulle, 0 est renvoyé. Donc, vous _devez_ appeler wasNull() après coup pour savoir si la colonne était réellement nulle.

Connaissance pratique, merci

@Romqa quel pilote JDBC utilisez-vous ?

@qualidafial , oui, le problème était dans mysql-connector, merci ;)

Cette page vous a été utile?
0 / 5 - 0 notes