2017-10-11 58 views
0

Nous avons une table avec une clé primaire composite cartographié, comme indiqué ci-dessous:NHibernate agrandir id composite à partir HQL

mapping.CompositeId().KeyReference(e => e.Node).KeyProperty(e => e.DtFr).UnsavedValue("any"); 

Nous devons supprimer plusieurs lignes de la table par condition complexe, par exemple n.Node.Contract.Code = "1234"

Selon le solution nous avons essayé suivante HQL:

delete from Entity n where n in (select c from Entity c where c.Node.Contract.Code = "1234") 

Mais dans la requête SQL généré, il n'y a pas entre parenthèses autour des colonnes de clé primaire :

select ... from ENTITY n where n.IDNODE, n.DTFR in (select c.IDNODE, c.DTFR ... 

Nous avons essayé explicitement d'ajouter entre parenthèses dans HQL (where (n) in), mais NHibernate les ignore.

Que pouvons-nous faire pour que NHibernate génère le bon SQL?

La version de NHibernate est 4.1.1.4000, SGBDR est Oracle 10.2.

Le dialecte SQL est défini sur NHibernate.Dialect.Oracle10gDialect.

Répondre

1

Il est très probable qu'il y ait un bug dans NHibernate. Le problème est ajouté: https://github.com/nhibernate/nhibernate-core/issues/1376.

Pour l'instant, la seule solution est: chargez toutes les entités que vous voulez supprimer, puis supprimez-les.

var entities2delete = session.CreateQuery("select c from Entity c where c.Node.Contract.Code = \"1234\"").List(); 
foreach (var item in entities2delete) session.Delete(item);