0

ソーシャル ネットワーキング サイトの基準クエリがあります。Person オブジェクトには、Friends (同じく 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>();
}
4

1 に答える 1

3

ステートメントの順序により、クエリが取得している望ましくない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 データを取得する関連付けから明確ではありません。Criteria ステートメントでそれを使用しているため、friendsAlias. 代わりに を使用するように変更しましたpersonAlias。これは、データの関連付け元であると思われるためです。

于 2009-11-12T00:17:13.220 に答える