Nhibernate много-много желающих загрузить в одном запросе SQL? - PullRequest
1 голос
/ 26 декабря 2010

Как заставить 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 ]

2 голосов
/ 26 декабря 2010

Я считаю, что вы действительно пытаетесь сделать следующее:

var list = session.CreateCriteria<Q>()
                  .SetFetchMode("PList", FetchMode.Join)
                  .List();

Обновление на основе вашего комментария:

Это громоздко и обычно не стоит того, чтобы пытатьсяполучить целый граф со многими коллекциями, используя соединения.Для этого конкретного случая я предлагаю вам использовать batch-size в коллекциях и позволить NH выполнять пакетную отложенную загрузку.

В зависимости от вашего кода, также возможно, что HQL-запрос извлекает данные, которые вы хотите лучшечем навигация по графу объектов.

1 голос
/ 27 декабря 2010

или используйте HQL для достижения того же результата, ваш запрос будет выглядеть следующим образом

var hqlQuery="select p from Q as q inner join fetch q.PList as p";

Вы выполняете запрос следующим образом:

 Sesssion.CreateQuery(hqlQuery).List<P>();

Надеюсь, это поможет.

...