2009-11-09 4 views
1

J'essaie de comprendre comment générer une jointure simple qui utilise une clause 'or', en utilisant les annotations HQL ou Hibernate. Voici un exemple de ce que je veux que le SQL ressemble:Hibernate Joindre avec la clause OR

select * 
from tableA 
left outer join tableB 
    on tableA.id1 = tableB.id1 
    or tableA.id2 = tableB.id2 
where ... 

Je sais que je peux faire du code SQL directement pour cela, je veux cependant profiter du niveau d'abstraction Hibernate. J'ai vu @JoinColumns mais cela semble être un 'et' dans la jointure. Je profite de cette jointure avec une requête HQL typée, donc j'ai aussi la possibilité de dévier un peu des annotations et de l'utiliser là-dedans ... des idées?

+0

On ne sait pas très bien ce que vous essayez de faire. Ecrire une requête HQL en utilisant la jointure ci-dessus? Ou mapper une association (many-to-one?) Entre deux entités en fonction des identifiants OR? – ChssPly76

+0

Je serais heureux avec l'un ou l'autre, cependant ma préférence serait sur la façon de mapper correctement cette association en utilisant Hibernate Annotations, où tableA est le One et tableB est le Many. C'est très simple de faire un mapping normal, mais la condition 'OU' dans la jointure est ce qui me lance. –

Répondre

1

Je dois dire que c'est un peu ésotérique; S'il était possible de cartographier votre association de la sorte, il serait très probablement assez effrayant (à moins que les deux tables impliquées soient assez petites).

Mais, pour autant que je sache, il est impossible:

  1. Vous ne pouvez pas mapper une association sur des colonnes directement
  2. OU logique
  3. Vous ne pouvez pas utiliser de jointure type autre que cross join sur entités non connectées par association.
  4. Vous ne pouvez pas spécifier custom loader pour autre chose que la collecte - est-ce que votre tableB contient des éléments de collection pour les lignes tableA? Même si c'est le cas, vous ne pourrez utiliser ce chargeur que pour la récupération de collection directe; cela ne fonctionnera pas dans le cadre d'une requête HQL plus complexe.