我有一个社交网站条件查询。一个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>();
}
有帮助吗?

解决方案

我相信,你的语句的顺序导致查询产生你所得到的不希望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>();
}

此外,通过你的描述它不是来自你想从获得MainProfileImage和MediumThumbnail数据,关联明确。当你在你的条件语句中使用它,你问的数据来自于主Person对象,其朋友你正在为你使用的是friendsAlias。我已经改变了它使用personAlias,而不是因为我相信这是你的意思是将数据从相关联。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top