Pergunta

Eu tenho uma consulta de critérios para um site de redes sociais. Um objeto de pessoa tem uma coleção de amigos (também objetos de pessoa). A consulta pega os primeiros n amigos, mas também quero carregar um objeto associado MainProfileImage e, em seguida, um objeto associado subsequente Mediumthumbnail.

Eu posso fazer isso no 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

Aqui está o meu esforço de critério. Por alguma razão, isso não retorna nada!

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>();
}
Foi útil?

Solução

Acredito que a ordem de suas declarações faz com que a consulta gere o SQL não desejado que você está obtendo (portanto, não há resultados). Aqui está como deve ser:

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

Além disso, por sua descrição, não está claro a partir de qual associação você deseja obter os dados do MaiorProfileImage e do MediumThumbnail. Enquanto você o está usando em sua declaração de critérios, você está pedindo que os dados venham do objeto principal de pessoa cujos amigos você está recebendo enquanto está usando o friendsAlias. Eu mudei para usar o personAlias em vez disso, como acredito, é onde você pretende associar os dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top