J'ai ce mapping NHibernate Fluent:NHibernate - aller chercher à terme
public LossMap()
{
Table("losses");
Id(x => x.Id).Column("id");
References(x => x.Policy).Column("pol_id");
HasMany(x => x.Statuses).KeyColumn("loss_id").Cascade.All().Inverse();
HasMany(x => x.Reserves).KeyColumn("loss_id").Cascade.All().Inverse();
HasMany(x => x.Payments).KeyColumn("loss_id").Cascade.All().Inverse();
}
public LossPaymentMap()
{
Table("losspayments");
Id(x => x.Id).Column("id");
Map(x => x.Type).Column("type_id");
References(x => x.Reserve).Column("reserve_id");
}
public LossReserveMap()
{
Table("lossreserves");
Id(x => x.Id).Column("id");
Map(x => x.Type).Column("type_id");
Map(x => x.Status).Column("status_id");
References(x => x.ParentReserve).Column("parent_reserve_id");
}
public LossStatusMap()
{
Table("lossstatuses");
Id(x => x.Id).Column("id");
Map(x => x.Status).Column("status_id");
Map(x => x.ExpirationDate).Column("expirationdate");
References(x => x.Loss).Column("loss_id");
}
Pour résumer:
- perte a beaucoup de paiements, les réserves et les états
- Paiement a une réserve
J'essaie d'aller chercher des Pertes et leurs paiements et réserves (mais pas les statuts) avec le suivant les contraintes de l'aile:
- Seules les pertes qui vont chercher ont au moins un statut avec « status.Status pas (1,2,7) ».
- extraient que Loss.Payments où "loss.Payment.Type = 2 et loss.Payment.Reserve.Status! = 4)"
- extraient que Loss.Reserves où Reserve.Status! = 3
comme je suis en train de chercher 2 relations parallèles, je dois utiliser multiqueries ou à terme pour éviter le produit cartésien (droit?), comme expliqué ici: http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate
je suis venu avec cette requête (en HQL):
int[] statuslist = new int[3] {1, 2, 7};
var losses =
session.CreateQuery(
"from Loss l left join fetch l.Payments as payment join l.Statuses as status where l.Policy.Product.Id = :tid1 " +
"and status.Status not in (:statuslist1) " +
"and payment.Type = 2 and payment.Reserve.Status != 4")
.SetParameter("tid1", productid)
.SetParameterList("statuslist1", statuslist)
.Future<Loss>();
session.CreateQuery(
"from Loss l left join fetch l.Reserves as reserve join l.Statuses as status where l.Policy.Product.Id = :tid2 " +
"and status.Status not in (:statuslist2) " +
"and reserve.Status != 3 ")
.SetParameter("tid2", productid)
.SetParameterList("statuslist2", statuslist)
.Future<Loss>();
var list = losses.ToList();
Cependant, lors de l'exécution de cette requête, j'obtiens une erreur: NHibernate.HibernateException: Impossible d'exécuter la requête multiple [.. requête SQL] ---> System.ArgumentException: La valeur "System.Object []" n'est pas de type " Entities.Loss "et ne peut pas être utilisé dans cette collection générique.
Des indices sur ce que je fais mal ici?
Lorsque je supprime la contrainte d'état, la requête fonctionne:
var losses =
session.CreateQuery(
"from Loss l left join fetch l.Payments as payment where l.Policy.Product.Id = :tid1 " +
"and payment.Type = 2 and payment.Reserve.Status != 4")
.SetParameter("tid1", productid)
.Future<Loss>();
session.CreateQuery(
"from Loss l left join fetch l.Reserves as reserve where l.Policy.Product.Id = :tid2 " +
"and reserve.Status != 3 ")
.SetParameter("tid2", productid)
.Future<Loss>();
Cependant, les résultats ne sont pas ce que je veux (je dois cette contrainte).
Un conseil? Oh, et l'utilisation de HQL n'est pas un "must", si cela est possible avec Linq ou QueryOver, cela ne me pose aucun problème.
Merci!
est-il un moyen de faire le même genre de projet ion en utilisant l'API NHibernate LINQ? –
Je n'utilise pas linq donc je ne suis pas sûr, bien que cela semble être ce que vous voulez http://stackoverflow.com/questions/796889/nhibernate-linq-and-distinctrootentity –