Comment mapper TINYINT (1) de MySQL à Boolean dans jOOQ – Java, SQL et jOOQ.

Online Coding Courses for Kids

MySQL 8 ne prend pas encore en charge le BOOLEAN tapez comme spécifié dans la norme SQL. Il existe un «type» DDL appelé BOOL, qui n’est qu’un alias pour TINYINT:

create table t(b bool);

select 
  table_name, 
  column_name, 
  data_type, 
  column_type
from information_schema.columns
where table_name = 't';

Ce qui précède produit:

TABLE_NAME|COLUMN_NAME|DATA_TYPE|COLUMN_TYPE|
----------|-----------|---------|-----------|
t         |b          |tinyint  |tinyint(1) |

Remarquerez que BOOL se traduit par un “type” spécifique de TINYINT, une TINYINT(1), où nous pourrions être enclins à croire que la (1) correspond à une sorte de précision, comme avec NUMERIC les types.

Cependant, contre intuitivement, ce n’est pas le cas. Il correspond à la largeur d’affichage du type, lors de sa récupération, en utilisant certains modes obsolètes. Considérer:

insert into t(b) values (0), (1), (10);
select * from t;

Nous obtenons:

b |
--|
 0|
 1|
10|

Notez également que MySQL peut traiter les types non booléens comme des booléens. Exécution de l’instruction suivante:

select * from t where b;

Nous obtenons:

b |
--|
 1|
10|

Utilisation de cette colonne comme colonne booléenne dans jOOQ

Par défaut, jOOQ ne reconnaît pas ces TINYINT(1) colonnes en tant que colonnes booléennes, car il est totalement possible qu’un utilisateur ait créé une telle colonne sans penser aux types booléens, comme l’exemple ci-dessus l’a montré.

Dans les versions précédentes de jOOQ, le fonction de réécriture du type de données pourrait être utilisé sur des expressions arbitraires qui correspondent au nom de la colonne booléenne, par ex. ce qui suit traiterait toutes les colonnes nommées "B" comme BOOLEAN:


  
    BOOLEAN
    B
  

Avec jOOQ 3.12.0 (problème # 7719), nous pouvons maintenant faire correspondre cette largeur d’affichage également pour les types MySQL. De cette façon, vous pouvez écrire cette configuration de réécriture de type de données unique pour traiter tous les types entiers de largeur d’affichage 1 comme des booléens:


  
    BOOLEAN
    (?i:TINYINT(1))
  

En utilisant cette configuration dans le générateur de code, la requête ci-dessus:

select * from t where b;

… Peut maintenant s’écrire comme suit, en jOOQ

selectFrom(T).where(T.B).fetch();

Close Menu