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
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 ;)