NHibernate Jointure Externe Gauche Entités Indépendantes
j'ai 2 entités rôle & traduction.
Rôle - > Role_ID, Code
Traduction - > Code, Langue, Nom
l'idée est de dire pour un certain rôle, qu'il a Nom anglais, nom français et ainsi de suite.
Par exemple:
Un rôle(1, 'Rol_001') peut avoir les relations: traduction ('Rol_001',' English',") & traduction ('Rol_001',' French',").
Je voudrais exprimer la requête SQL suivante dans HQL:
select r.Role_ID, t.Name
from Role r left outer join Translation t
on r.Code = t.Code and t.Language = @lang;
dans Mes fichiers de mapping Je n'ai aucune relation entre les 2 entités, mais la requête HQL suivante fonctionne comme si elle était inner join
IQuery query = session.CreateQuery("select new Lookup(r.Role, t.Name) from Role r, Translation t where r.Code = r.Code and t.Language = :language");
si je change le HQL en jointure externe gauche, j'obtiens le chemin prévu pour l'exception jointure.
Pouvez-vous m'aider avec ce qui suit:
1-est-ce que je dois changer mes fichiers de mappage?
2 - si je peux garder les fichiers de mapping tels quels, comment écrire une telle requête dans HQL?
3 - Comment HQL fonctionne vraiment? Pourquoi une requête de jointure externe aussi simple ne fonctionne pas? Je dois manquer quelque chose ici!
Edit:
Maintenant j'utilise le code suivant basé sur la suggestion D'utiliser CreateSQL:
ISQLQuery query = session.CreateSQLQuery("select m.MedicineTypeID, t.Name, m.IsDeleted from MedicineType m left outer join Translation t on m.Code = t.Code and t.Language = :language");
query.SetString("language", language);
IList rawLookup = query.List();
IList medicineTypesLookup = new List(rawLookup.Count);
foreach (object[] lookup in rawLookup)
{
medicineTypesLookup.Add(new Lookup((int)lookup[0], (string)lookup[1], (bool)lookup[2]));
}
return medicineTypesLookup;
Cela fonctionne, cependant je veux utiliser la requête.Liste() pour obtenir le résultat directement au lieu de le convertir moi-même.
J'ai essayé d'utiliser query.AddEntity(typeof(Lookup));
mais j'ai l'exception NHibernate.MappingException: No persister for: DAL.Domain.Lookup
.
La recherche est juste un POCO et ne correspond à aucune table de base de données. Son fichier de correspondance est tout simplement <import class="Lookup" />
2 réponses
finalement j'ai trouvé la réponse:
ISession session = NHibernateHelper.Session;
ISQLQuery query = session.CreateSQLQuery("select m.MedicineTypeID as ID, t.Name, m.IsDeleted from MedicineType m left outer join Translation t on m.Code = t.Code and t.Language = :language");
query.setString("language", language);
IList lookup = query.SetResultTransformer(Transformers.AliasToBean()).List();
return lookup;
Et la recherche est une classe POCO avec un constructeur sans paramètres et 3 propriétés ID, Name et IsDeleted.
Je voudrais remercier Kelly et Diego Mijelshon pour leurs conseils. Bien qu'ils ne fournissent pas la réponse complète La, mais en utilisant la Session.CreateSqlQuery () était un indice très utile.
donc la solution complète est Session.CreateSQLQuery and query.SetResultTransformer
Remarque: Les Transformateurs.AliasToBean () est tellement java.
Edit: http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/impl/SQLQueryImpl.html pour la méthode correcte de setString()
vous devez définir la relation dans les mappings ou faire un sous-titrage