Question

J'ai une requête de critères pour un site de réseautage social. Un objet Person a une collection d'amis (aussi D'autres objets personne). La requête saisit les premiers amis N, mais je veux aussi à la charge d'un objet associé désireux MainProfileImage puis un objet associé après MediumThumbnail.

Je peux le faire dans HQL facilement:

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

Voici mon effort de critères. Pour une raison quelconque, cela ne retourne rien!

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>();
}
Était-ce utile?

La solution

Je crois que l'ordre de vos déclarations provoque la requête pour générer le SQL que vous n'obtenez désiré (donc pas de résultats). Voici comment il devrait être:

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

De plus par votre description, il ne ressort pas de quelle association vous souhaitez obtenir les données MainProfileImage et MediumThumbnail de. Comme vous utilisez dans votre déclaration de critères que vous demandez les données à venir de l'objet principal de la personne dont les amis que vous obtenez comme vous utilisez le friendsAlias. Je l'ai changé pour utiliser le personAlias à la place que je crois que c'est là que vous voulez dire associer les données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top