我正在使用 NHibernate 3.3.1 和 FluentNhibernate 1.3 作为数据层。
我有以下实体:
数据库图:
我需要一种按产品媒体的媒体类别获取产品的方法。我希望 NHibernate 只向 db 发送一个查询并获取产品的所有子属性。
我希望 NHibernate 发送这样的查询:
declare @mediaCategoryId int = 13
select *
from Product p
inner join Media m on m.ProductId=p.Id
inner join MediaCategoryMedia mcm on mcm.MediaId=m.Id
inner join MediaCategory mc on mc.Id=mcm.MediaCategoryId
left join ProductSeller ps on ps.ProductId=p.Id
left join Seller s on ps.SellerId=s.Id
where mc.Id=@mediaCategoryId
我尝试了以下选项来解决这个挑战;
session
.QueryOver< ProductEntity >()
...
我已经尝试过Inner.JoinQueryOver< .. >().Fetch.Eager
...但我无法获取所有子实体。session.CreateCriteria< ProductEntity >().SetFetchMode("",FetchMode.Eager)
...
在这种情况下,延迟加载有效,我不想要延迟加载。如果我从映射中禁用延迟加载,NH 会发送大量查询。我想要的是通过一个获取所有子实体的单个查询进行急切加载。session.Query< ProductEntity >().FetchMany(p=>p.MediaList).ThenFetchMany(m=>m.SellerList)
...
在这种情况下,我无法创建别名来传递 mediaCategoryId 过滤器。相反,我使用.Where(x=>x.MediaList.Any(m=>m.CategoryList.Any(...)))
并且生成的查询也不是最佳的。(from p in session.Query< ProductEntity >()
from m in p.MediaList
from c in m.MediaCategoryList
where c.Id==23
select p).Fetch(x=>x.MediaList);这也没有按我的意愿工作..
var hql=@"select p from ProductEntity as p join fetch p.MediaList as m join fetch m.MediaCategoryList as mc left join fetch p.SellerList as s where mc.Id=:catId ";
这适用于 hql 中的“join fetch”。
我需要这个案例的最佳实践,但是 Hql 是王道。session.Query<>()
我们可以用orsession.CreateCriteria,
或处理这种情况QueryOver
吗?