Multiple jointures sur Oracle 10g avec NHibernate

Quelques posts parlent d’un bug survenant avec oracle 10g et NHibernate lors d’une jointure multiple.

Survient alors une erreur “ORA-00904”. Une fois le code SQL généré lu, on se rend compte que les jointures suivant une virgule sont alors incapable d’utiliser des valeurs déclarées dans le Select.

left outer join "City" city2_ on address1_.City_id=city2_.Id, "Country" country6_
left outer join Provider_Specialities specialiti3_ on provider0_.Id=specialiti3_.Provider_id

donc l’utilisation de provider0_.Id dans le second join est invalidé par le “,” du premier join.

Le code incriminé se situe dans le fichier Oracle10gDialect.cs dans NHibernate.Dialect. En voici son code :

public class Oracle10gDialect : Oracle9iDialect
{
    public override JoinFragment CreateOuterJoinFragment()
    {
        return new ANSIJoinFragment();
    }
}

Le workaround le plus simple à mettre en place est de changer le dialect de votre SessionFactory de Oracle10 vers Oracle9.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.