Domanda

Ho una query Criteri per un sito di social networking. Un oggetto Person ha una collezione di amici (anche oggetti persona). La query afferra i primi N amici, ma voglio anche carico desiderosi di un MainProfileImage oggetto associato e poi una successiva oggetto associato MediumThumbnail.

posso fare questo in HQL facilmente:

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

Ecco il mio sforzo criteri. Per qualche motivo questo non restituisce nulla!

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>();
}
È stato utile?

Soluzione

Credo che l'ordine delle sue dichiarazioni causa la query per generare il codice SQL non desiderato che si stanno ottenendo (quindi nessun risultato). Ecco come dovrebbe essere:

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

Inoltre dalla tua descrizione non è chiaro da cui l'associazione si desidera ottenere i dati MainProfileImage e MediumThumbnail da. Come lo si utilizza nella sua dichiarazione Criteri si sta chiedendo i dati a venire dall'oggetto principale persona di cui gli amici si stanno ottenendo come si utilizza il friendsAlias. Ho cambiato in modo da utilizzare la personAlias invece come credo che questo è dove si intende associare i dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top