如何强制nhibernate在一个sql查询中完全加载多对多数据。 我试过这个:
var list = session.CreateCriteria<Q>("q")
.CreateAlias("q.PList", "p", JoinType.LeftOuterJoin)
.List();
但它只加载q.PList,当我尝试访问q.PList [0]时.QList [0] .PList [0] NH执行额外的选择查询。
实体以及我如何映射它们:
public class P
{
public virtual Guid Id { get; set; }
public virtual IList<Q> QList { get; set; }
}
public class Q
{
public virtual Guid Id { get; set; }
public virtual IList<P> PList{ get; set; }
}
public class PMap : ClassMap<P>
{
public PMap()
{
Table("p");
Id(t => t.Id);
HasManyToMany(t => t.QList)
.Table("q2p").ParentKeyColumn("pId").ChildKeyColumn("qId").Inverse();
}
}
public class QMap : ClassMap<Q>
{
public QMap()
{
Table("q");
Id(t => t.Id);
HasManyToMany(t => t.PList)
.Table("q2p").ParentKeyColumn("qId").ChildKeyColumn("pId");
}
}
答案 0 :(得分:2)
我相信你真正想做的是:
var list = session.CreateCriteria<Q>()
.SetFetchMode("PList", FetchMode.Join)
.List();
根据您的评论进行更新:
这很麻烦,通常不值得尝试使用连接来获取包含许多集合的整个图形。对于这种特殊情况,我建议你在集合上使用batch-size
,让NH进行批量延迟加载。
根据您的代码,HQL查询也可能比导航对象图更好地检索您想要的数据。
答案 1 :(得分:1)
或使用HQL实现相同目的 您的查询将如下所示
var hqlQuery="select p from Q as q inner join fetch q.PList as p";
您按如下方式运行查询:
Sesssion.CreateQuery(hqlQuery).List<P>();
希望有所帮助。