Bonjour,
j'utilise une base de données Oracle, j'ai un champ Oui ou Non,
comment je peux mapper ce champs en booléen ?Code:
1
2
3 actif VARCHAR2(1); actif in ('O','N')
existe-il le type boolean en Oracle ?
Merci
Version imprimable
Bonjour,
j'utilise une base de données Oracle, j'ai un champ Oui ou Non,
comment je peux mapper ce champs en booléen ?Code:
1
2
3 actif VARCHAR2(1); actif in ('O','N')
existe-il le type boolean en Oracle ?
Merci
Oracle ne dispose pas de type booléen.
En revanche JDBC propose une conversion (source)
merci pour ta réponse rapide, mais c'est pas ça que je recherche :oops:
j'ai trouvémais je ne sais pas comment sa fonctionne avec ma table ??Code:@Type(type="yes_no")
Merci
Si tu mappes cette colonne vers un attribut de type primitif booléen, la conversion (Java -> Oracle et Oracle -> Java) se fera automatiquement comme explicité dans le lien que je t'ai donné.
Tu cherches à mapper 'O' et 'N' vers true et false ?
Si c'est le cas le plus simple c'est d'ajouter des getter/setter qui manipule des booléens.
oui mon champ est soit oui soit non !!Citation:
Tu cherches à mapper 'O' et 'N' vers true et false ?
genre :Citation:
Si c'est le cas le plus simple c'est d'ajouter des getter/setter qui manipule des booléens.
Aujourd'hui 11h32
Code:
1
2
3
4
5
6
7
8
9
10
11
12 public Boolean getActif() { if (actif == null) return null; return actif == "O" ? Boolean.TRUE : Boolean.FALSE; } public void setActif(boolean actif) { if ("null".equals(actif)) { this.actif = null; } else { this.actif = actif == true ? "O" : "N"; } }
Je dirais plutôt soit 'O' soit 'N' :) Car si c'est juste pour faire du booléen peut importe la valeur en base. Autant utiliser le mécanisme de base.
Version corrigée
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public static final String ACTIF_VALUE_TRUE = "O"; public static final String ACTIF_VALUE_FALSE = "N"; public Boolean isActif() { if (actif == null) return null; if (ACTIF_VALUE_TRUE.equals(actif)) return Boolean.TRUE; if (ACTIF_VALUE_FALSE.equals(actif)) return Boolean.FALSE; // Unexpected value (use default) actif = null; return null; } public void setActif(Boolean isActif) { if (isActif == null) actif = null; else if (isActif) actif = ACTIF_VALUE_TRUE; else actif = ACTIF_VALUE_FALSE; }
j'ai une erreur
Code:
1
2
3
4
5 ......... org.hibernate.exception.GenericJDBCException: could not load an entity:MaTable (classe de mapping qui contient actif) ......... java.sql.SQLException: Echec de conversion dans la représentation interne
Créé une propriété de type String (ou Character si c'est du char(1)) que tu mappes normalement avec ta colonne. Au passage tu peux marquer les getter/setter avec @Deprecated pour ne pas être tenté de les utiliser depuis ton code client.
Et ensuite tu créé une nouvelle paire de getter/setter pour un Boolean qui font ce que t'as dit Nemek mais qui pointent vers la propriété mappée.
mais comme ça j'aurais 2 setter du meme nom ????
Code:
1
2
3setActif pour la propriété mappé et setActif pour le boolean
adapte le nom :
Code:
1
2
3
4
5
6
7
8
9
10 class MonEntite { String rawActif @Deprecated protected String getRawActif() { return rawActif; } @Deprecated // Tu peux également gérer les valeurs bizzarres ici protected void setRawActif(String actif) { rawActif = actif; } public Boolean isActif() { ... } public void setActif(Boolean actif) { ... } }
sa fonctionne pas :oops:
ce que j'ai fait :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 @Column(name = "ACTIF", nullable = false, length = 1) @Deprecated public String getActif() { return actif; } @Deprecated public void setActif(String actif) { this.actif = actif; } public Boolean isActivate() { if (actif == null) return null; if (ACTIF_VALUE_TRUE.equals(actif)) return Boolean.TRUE; if (ACTIF_VALUE_FALSE.equals(actif)) return Boolean.FALSE; // Unexpected value (use default) actif = null; return null; } public void setActivate(Boolean isActif) { if (isActif == null) actif = null; else if (isActif) actif = ACTIF_VALUE_TRUE; else actif = ACTIF_VALUE_FALSE; }
Code:ORA-00904: "UTILISATEU0_"."ACTIVATE" : identificateur non valide
Rajoute unsur isActivate() et appelle setActif() getActif() au lieu de passer directement par le champ.Code:@Transient