NHibernate Lambda Extensions-急切地加载集合';s协会

NHibernate Lambda Extensions-急切地加载集合';s协会,nhibernate,criteria,icriteria,nhlambdaextensions,Nhibernate,Criteria,Icriteria,Nhlambdaextensions,我有一个社交网站的条件查询。Person对象有一组朋友(也是Person对象)。该查询获取前N个好友,但我还希望加载一个关联的对象MainProfileImage,然后加载一个后续的关联对象MediumThumbnail 我可以在HQL中轻松做到这一点: select friends from Person person inner join person.Friends friends inner join fetch friends.MainProfileImage image inner

我有一个社交网站的条件查询。Person对象有一组朋友(也是Person对象)。该查询获取前N个好友,但我还希望加载一个关联的对象MainProfileImage,然后加载一个后续的关联对象MediumThumbnail

我可以在HQL中轻松做到这一点:

select friends from Person person inner join person.Friends friends inner join fetch friends.MainProfileImage image inner join fetch image.MediumThumbnail where person = :person1 order by friends.LatestLogin desc
这是我的标准努力。由于某些原因,这不会返回任何内容

public static IList<Person> GetFriends(Person person, int count)
{
    Person personAlias = null;
    Person friendAlias = null;

    ICriteria criteria = NHibernateSessionManager.Instance.GetSession()
        .CreateCriteria(typeof (Person), () => personAlias)
        .CreateCriteria(() => personAlias.Friends, () => friendAlias, JoinType.LeftOuterJoin)
        .CreateCriteria(() => friendAlias.MainProfileImage, JoinType.InnerJoin)
        .CreateCriteria(() => friendAlias.MainProfileImage.MediumThumbnail, JoinType.InnerJoin)
        .AddOrder(() => personAlias.LatestLogin, Order.Desc)
        .Add<Person>(p => p.ID == person.ID)
        .SetMaxResults(count);
    return criteria.List<Person>();
}
公共静态IList GetFriends(个人,整数计数)
{
Person personAlias=null;
Person-friendAlias=null;
ICriteria criteria=NHibernateSessionManager.Instance.GetSession()
.CreateCriteria(个人类型),()=>personAlias)
.CreateCriteria(()=>personAlias.Friends,()=>friendAlias,JoinType.LeftOuterJoin)
.CreateCriteria(()=>friendAlias.MainProfileImage,JoinType.InnerJoin)
.CreateCriteria(()=>friendAlias.MainProfileImage.MediumThumbnail,JoinType.InnerJoin)
.AddOrder(()=>personAlias.LatestLogin,Order.Desc)
.Add(p=>p.ID==person.ID)
.SetMaxResults(计数);
返回条件。List();
}

我相信,语句的顺序会导致查询生成您想要的SQL(因此没有结果)。 以下是它应该是什么样子:

public static IList<Person> GetFriends(Person person, int count)
{
    Person personAlias = null;
    Person friendAlias = null;

    ICriteria criteria = NHibernateSessionManager.Instance.GetSession()
        .CreateCriteria(typeof (Person), () => personAlias)
        .CreateCriteria(() => personAlias.Friends, () => friendAlias, JoinType.LeftOuterJoin)
        .Add<Person>(p => p.ID == person.ID)
        .CreateCriteria(() => personAlias.MainProfileImage, JoinType.InnerJoin)
        .CreateCriteria(() => personAlias.MainProfileImage.MediumThumbnail, JoinType.InnerJoin)
        .AddOrder(() => personAlias.LatestLogin, Order.Desc)
        .SetMaxResults(count);
    return criteria.List<Person>();
}
公共静态IList GetFriends(个人,整数计数)
{
Person personAlias=null;
Person-friendAlias=null;
ICriteria criteria=NHibernateSessionManager.Instance.GetSession()
.CreateCriteria(个人类型),()=>personAlias)
.CreateCriteria(()=>personAlias.Friends,()=>friendAlias,JoinType.LeftOuterJoin)
.Add(p=>p.ID==person.ID)
.CreateCriteria(()=>personAlias.MainProfileImage,JoinType.InnerJoin)
.CreateCriteria(()=>personAlias.MainProfileImage.MediumThumnail,JoinType.InnerJoin)
.AddOrder(()=>personAlias.LatestLogin,Order.Desc)
.SetMaxResults(计数);
返回条件。List();
}

此外,根据您的描述,还不清楚您希望从哪个关联获取MainProfileImage和MediumThumbnail数据。当您在Criteria语句中使用它时,您要求数据来自主要Person对象,在您使用
friendsAlias
时,您将获得其朋友。我已将其改为使用
personAlias
,因为我相信这是您要关联数据的地方。

我相信您语句的顺序会导致查询生成您正在获取的不需要的SQL(因此没有结果)。 以下是它应该是什么样子:

public static IList<Person> GetFriends(Person person, int count)
{
    Person personAlias = null;
    Person friendAlias = null;

    ICriteria criteria = NHibernateSessionManager.Instance.GetSession()
        .CreateCriteria(typeof (Person), () => personAlias)
        .CreateCriteria(() => personAlias.Friends, () => friendAlias, JoinType.LeftOuterJoin)
        .Add<Person>(p => p.ID == person.ID)
        .CreateCriteria(() => personAlias.MainProfileImage, JoinType.InnerJoin)
        .CreateCriteria(() => personAlias.MainProfileImage.MediumThumbnail, JoinType.InnerJoin)
        .AddOrder(() => personAlias.LatestLogin, Order.Desc)
        .SetMaxResults(count);
    return criteria.List<Person>();
}
公共静态IList GetFriends(个人,整数计数)
{
Person personAlias=null;
Person-friendAlias=null;
ICriteria criteria=NHibernateSessionManager.Instance.GetSession()
.CreateCriteria(个人类型),()=>personAlias)
.CreateCriteria(()=>personAlias.Friends,()=>friendAlias,JoinType.LeftOuterJoin)
.Add(p=>p.ID==person.ID)
.CreateCriteria(()=>personAlias.MainProfileImage,JoinType.InnerJoin)
.CreateCriteria(()=>personAlias.MainProfileImage.MediumThumnail,JoinType.InnerJoin)
.AddOrder(()=>personAlias.LatestLogin,Order.Desc)
.SetMaxResults(计数);
返回条件。List();
}

此外,根据您的描述,还不清楚您希望从哪个关联获取MainProfileImage和MediumThumbnail数据。当您在Criteria语句中使用它时,您要求数据来自主要Person对象,在您使用
friendsAlias
时,您将获得其朋友。我已将其改为使用
personAlias
,因为我相信这是您要关联数据的地方。

那么为什么不让HQL保持原位?为什么不让HQL保持原位?这非常有效,谢谢!我确实不得不把friendAlias改成personAlias——这是我很难理解的事情,但它奏效了!请更新您的答案以反映这一点。再次感谢!答案更新!为了避免混淆别名,试着用语言表达查询。我们在Criteria查询中所说的是“获取与给定person对象(其ID为I)为好友的所有person对象”,这意味着您从给定person对象的friends集合中的元素开始查询。这就是为什么personAlias属于您的结果(给定oerson对象的朋友)而friendsAlias属于给定person对象的原因。混淆也来自于别名的不幸命名。这非常有效,谢谢!我确实不得不把friendAlias改成personAlias——这是我很难理解的事情,但它奏效了!请更新您的答案以反映这一点。再次感谢!答案更新!为了避免混淆别名,试着用语言表达查询。我们在Criteria查询中所说的是“获取与给定person对象(其ID为I)为好友的所有person对象”,这意味着您从给定person对象的friends集合中的元素开始查询。这就是为什么personAlias属于您的结果(给定oerson对象的朋友)而friendsAlias属于给定person对象的原因。混淆也来自于别名的不幸命名。