2008-10-08 8 views
2

Est-il possible de faire hiberner faire "la bonne chose" pour une certaine valeur de "droite" dans cette situation? La chose est que prop est un UserType avec une représentation différente dans les tables jointes. Dans le tableau A, il est représenté sous la forme d'un entier et dans la table B, il est représenté comme un char. Donc le test eq se traduit par voir si 1 == 'a' plus ou moins, ce qui est faux mais l'objet représenté par 1 ou 'a' devrait être le même donc ils doivent comparer true.UserType rejoindre dans Hibernate

Répondre

0

(1) Changer le type de données des colonnes qui correspondent à "prop" pour être le même. Cela nécessitera "Faire de DBA votre ami" mais aboutira à une utilisation "prop" UserType cohérente.

(2) Manipulez les différences de type méthode dans égaux()

public boolean equals(Object x, Object y) throws HibernateException { 
    boolean retValue = false; 
    if (x == y) retValue = true; 

    if (x!=null && y!=null){ 
     Character xChar = new Character(x); 
     Character yChar = new Character(y); 
     if (xChar.equals(ychar)){ 
      retValue = true; 
     } 
    } 

    return retValue; 
} 
+0

1 n'est pas une option car c'est un problème avec un système hérité utilisant la même base de données. 2. Ne sera pas traduit en sql. –

0

Est-ce que la jointure en utilisant une expression SQL. De cette façon, vous pouvez faire la conversion de type explicitement dans la requête elle-même.

2

Je pense que vous pouvez le faire en utilisant une balise <formula> sur la relation dans votre fichier de mappage.

Par exemple:

<many-to-one name="myClassB" class="ClassB"> 
    <formula>--Some SQL Expression that converts between ClassA.prop and ClassB.prop</formula> 
</many-to-one> 

Je l'ai utilisé cela pour associer deux tables où l'on utilise un entier, mais associé à un champ char dans une autre table. Ce n'est peut-être pas exactement ce que vous cherchez, mais peut-être que cela vous mettra sur la bonne voie.