Pregunta

Tengo una consulta Criterios para un sitio de redes sociales. Un objeto persona tiene una colección de los Amigos (también objetos persona). La consulta agarra los primeros amigos N, pero también desea cargar ansiosos un MainProfileImage objeto asociado y luego un objeto asociado posterior MediumThumbnail.

Puedo hacer esto en HQL fácilmente:

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

Aquí está mi esfuerzo Criterios. Por alguna razón esto no devuelve 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>();
}
¿Fue útil?

Solución

Creo que el orden de sus declaraciones hace que la consulta para generar el SQL no deseada que está recibiendo (por lo tanto, no hay resultados). Aquí es como debe 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>();
}

Además de su descripción no está claro a partir del cual la asociación desea obtener los datos MainProfileImage y MediumThumbnail partir. Como usted lo está utilizando en su estado de cuenta criterios que están pidiendo los datos que provienen de la persona objeto principal cuyos amigos que está recibiendo como está utilizando el friendsAlias. He cambiado a utilizar el personAlias lugar como creo que aquí es donde se refieres a asociar los datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top