nhibernatehibernatecreatecriteria

hibernate - createCriteria or createAlias?


If I want to search those students who take class "Math" and "John" is his group:

shoud I use createCriteria or createAlias?

Criteria:

Criteria criteria = session.createCriteria(Student.class);
Criteria subquery1 = criteria.createCriteria("courses", course).add(Restrictions.eq(course.name, "Math"));
Criteria subquery2 = criteria.createCriteria("group", student).add(Restrictions.eq(student.name, "John"));

how to put subquery1 and subquery2 together with initial criteria?

Alias:

Criteria criteria = session.createCriteria(Student.class).
createAlias("courses", course).add(Restrictions.eq(course.name, "Math")).
createCriteria("group", student).add(Restrictions.eq(student.name, "John"));

When to use createCriteria and when createAlias? I think the boath are the same...


Solution

  • CreateAlias and CreateCriteria are identical in the current versions of Hibernate and NHibernate. The only difference being that CreateCriteria has 2 additional overloads without the alias parameter.

    Presumably they were different in a older version, but any differences are long gone.

    An alias can be defined in terms of another alias, so your first example can be written as:

    // Java
    Criteria criteria = session.createCriteria(Student.class)
        .createAlias("courses", "course")
        .createAlias("course.group", "student")
        .add(Restrictions.eq("course.name", "Math"))
        .add(Restrictions.eq("student.name", "John"));
    
    // C#
    ICriteria criteria = session.CreateCriteria<Student>()
        .CreateAlias("Courses", "course")
        .CreateAlias("course.Group", "student")
        .Add(Restrictions.Eq("course.Name", "Math"))
        .Add(Restrictions.Eq("student.Name", "John"));