2014-07-18 5 views
2

J'évalue actuellement jOOQ. Et nous avons des problèmes avec la création de déclarations de jointure, comme ceci:Génération de code jOOQ: forcedType

create.select() 
     .from(TABLEA, TABLEB) 
     .where(TABLEA.ID.equal(TABLEB.TABLEA_ID)); 

En raison d'une incompatibilité de type. Dans la base de données (Oracle 11g) TABLEA est NUMBER(22,0), mais TABLEB.TABLEA_ID est NUMBER(7,0).

Par conséquent, jOOQ génère pour la première propriété un champ BigInteger, mais pour ce dernier un champ Integer.

J'ai donc essayé de générer tous NUMBER(.*,0) avec BigInteger avec le code XML suivant:

<forcedTypes> 
     <forcedType> 
      <name>DECIMAL_INTEGER</name> 
      <expression>.*</expression> 
      <types>NUMBER(.*,0)</types> 
     </forcedType> 
    </forcedTypes> 

</database> 

Mais cela ne fonctionne pas. J'ai toujours des champs avec Integer comme type. Alors, que puis-je faire à ce sujet, en plus de changer le type de colonne de la table?

Répondre

1

Malheureusement, #2485 n'est pas encore implémenté dans jOOQ 3.4, donc vous ne pouvez pas encore faire correspondre longueur, précision, échelle. Je me rends compte que le manuel semble indiquer le contraire, ce qui est faux ...

Si cela ne se produit qu'occasionnellement, vous pouvez également recourir à la manipulation de types de données via l'API jOOQ. Voici quelques options:

// This will render an actual cast in the generated SQL statement 
TABLEA.ID.equal(TABLEB.TABLEA_ID.cast(TABLEA.ID.getDataType())) 
TABLEA.ID.equal(TABLEB.TABLEA_ID.cast(BigInteger.class)) 

// This generate a new column TABLEA_ID of type NUMBER(22, 0) 
TABLEA.ID.equal(TABLEB.TABLEA_ID.coerce(TABLEA.ID.getDataType())) 
TABLEA.ID.equal(TABLEB.TABLEA_ID.coerce(BigInteger.class)) 

// This is your last resort: raw types 
TABLEA.ID.equal((Field) TABLEB.TABLEA_ID) 
+0

Malheureusement votre regex ne fonctionnait pas non plus. Cela a fonctionné pour 'NUMBER', mais il utiliserait aussi' BigInteger' pour les types 'NUMBER' avec échelle. –

+0

@ Angelo.Hannes: Mon mauvais, je suis désolé de la confusion. [# 2485] (https://github.com/jOOQ/jOOQ/issues/2486) n'est pas encore implémenté dans jOOQ 3.4, ce qui explique pourquoi cela ne fonctionne pas. Le manuel est faux ... Je suppose que vous devrez recourir à l'une des conversions explicites ci-dessus, ou écrire une regex correspondant à toutes les colonnes pertinentes de votre base de données - par exemple. toutes les colonnes se terminant par '_ID'? –

+0

Merci beaucoup. Je vais essayer l'une des solutions de contournement. –