سؤال

لدي استعلام معايير لموقع الشبكات الاجتماعية. يحتوي كائن الشخص على مجموعة من الأصدقاء (أيضا كائنات شخص). الاستيقاظ يمسك الأول الأصدقاء الأولين، لكني أرغب أيضا في حمل كائن مرتبط في الصفحة الرئيسية ProfoProfileImage ثم كائن مرتبط لاحق 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 و MediumThumbumbnail من. كما تستخدمه في بيان المعايير الخاصة بك، فأنت تطلب من البيانات أن تأتي من كائن الشخص الرئيسي الذي تحصل عليه أصدقائك كما كنت تستخدم friendsAlias. وبعد لقد غيرت ذلك لاستخدام personAlias بدلا من ذلك، أعتقد أن هذا هو المكان الذي تقصد فيه ربط البيانات من.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top