Frage

Ich habe eine Kriterien-Abfrage für eine social-networking-Website.Ein Person-Objekt ist eine Sammlung von Freunden (auch "person" - Objekte).Die Abfrage greift die ersten N-Freunde, ich möchte aber auch eifrig laden Sie ein Objekt zugeordnet MainProfileImage und dann einem nachfolgenden Objekt zugeordnet MediumThumbnail.

Kann ich dies in HQL einfach:

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

Hier Meine Kriterien Aufwand.Für einige Grund, warum dies nichts zurückgibt!

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>();
}
War es hilfreich?

Lösung

Ich glaube, dass die Reihenfolge der Anweisungen bewirkt, dass die Abfrage zu generieren, die nicht der gewünschten SQL-Sie sind immer (also auch keine Ergebnisse).Hier ist, wie es sein sollte:

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>();
}

Darüber hinaus, indem Sie Ihre Beschreibung es ist nicht klar, aus welchen Verein, Sie wollen den MainProfileImage und MediumThumbnail Daten aus.Wie Sie es in Ihrer Kriterien-Anweisung Sie sind gefragt, die Daten kommen von der wichtigsten Person-Objekt, dessen Freunde, die Sie bekommen, wie Sie mit Hilfe der friendsAlias.Ich habe es geändert, um die Verwendung der personAlias stattdessen glaube ich, dass das ist, wo Sie meinen, verknüpfen Sie die Daten aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top