在一个SQL查询中Nhibernate多对多的急切加载?

时间:2010-12-26 13:21:22

标签: nhibernate fluent-nhibernate many-to-many criteria eager-loading

如何强制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");
    }
}

2 个答案:

答案 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>();

希望有所帮助。