NHibernate Lambda Extensions-急切地加载集合';s协会
我有一个社交网站的条件查询。Person对象有一组朋友(也是Person对象)。该查询获取前N个好友,但我还希望加载一个关联的对象MainProfileImage,然后加载一个后续的关联对象MediumThumbnail 我可以在HQL中轻松做到这一点: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
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对象的原因。混淆也来自于别名的不幸命名。