J'ai 2 entités Rôle & Traduction.
rôle -> ROLE_ID, Code
Traduction -> Code, Langue, NomNHibernate Left Outer Rejoindre des entités non liées
L'idée est de dire pour un certain rôle, qu'il a le 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', 'Français', '').
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 mappage Je n'ai aucune relation entre les 2 entités, mais la requête HQL suivante fonctionne comme si elle est jointure Si je change la HQL en jointure externe gauche, j'obtiens le chemin attendu pour l'exception de jointure.
Pouvez-vous m'aider avec ce qui suit:
1- Dois-je changer mes fichiers de cartographie?
2- Si je peux conserver les fichiers de mapping tels quels, comment écrire une telle requête dans HQL?
3- Comment fonctionne vraiment HQL? Pourquoi une telle requête de jointure externe ne fonctionne-t-elle pas? Je dois manquer quelque chose ici!
Edit:
Maintenant, je suis en utilisant le code suivant en fonction de la suggetion 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 mais je veux utiliser Query.list() 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 mappage est tout simplement <import class="Lookup" />
HQL utilise des relations cartographié, pas arbitraire clauses de jointure. Vous pouvez utiliser SQL pour y parvenir. –
Ceci est un SQL Server CE, puis-je exécuter une instruction SQL en utilisant directement NHibernate ou dois-je utiliser SqlCeConnection et SqlCeCommand pour ExecuteReader l'instruction SQL et obtenir le résultat? –
Je vois que je peux utiliser session.CreateSQLQuery mais le résultat est un Object []. J'essaie de trouver un moyen d'obtenir le résultat comme IList. –