我有这个 Fluent NHibernate 映射:
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");
}
总结一下:
- 损失有许多付款、准备金和状态
- 付款有一个储备
我正在尝试获取具有以下约束的损失及其付款和准备金(但不是状态):
- 仅获取至少具有“status.Status not in (1,2,7)”状态的损失。
- 仅获取“loss.Payment.Type = 2 and loss.Payment.Reserve.Status != 4)”的 Loss.Payments
- 仅在 Reserve.Status != 3 处获取 Loss.Reserves
当我试图获取 2 个并行关系时,我必须使用多查询或期货来避免笛卡尔积(对吗?),如下所述:http: //ayende.com/blog/4367/eagerly-loading-entity-associations-高效地休眠
我想出了这个查询(在 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();
但是,执行此查询时,出现错误:NHibernate.HibernateException: Failed to execute multi query[..SQL query]---> System.ArgumentException: The value "System.Object[]" is not of type "Entities .Loss”并且不能在这个通用集合中使用。
任何线索我在这里做错了什么?
当我删除状态约束时,查询有效:
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>();
但是,结果不是我想要的(我需要那个约束)。
有什么建议吗?
哦,使用 HQL 不是“必须的”,如果可以使用 Linq 或 QueryOver,我对此没有任何问题。
谢谢!