Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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...

like image 518
senzacionale Avatar asked Feb 27 '10 12:02

senzacionale


2 Answers

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")); 
like image 123
Lachlan Roche Avatar answered Oct 03 '22 05:10

Lachlan Roche


Adding to xavierzhoa's answer:

There is actually quite a big difference between the two methods which you will notice if you chain Criteria methods. You will continue to work on the original Criteria object when using createAlias, whereas you work on a more nested scope when using createCriteria.

Consider this:

    Criteria c = getSession()       .createCriteria(YourEntity.class)       .createCriteria("someMember", "s")       .add(Restrictions.eq("name", someArgument));  // checks YourEntity.someMember.name 

versus

    Criteria c = getSession()       .createCriteria(YourEntity.class)       .createAlias("someMember", "s")       .add(Restrictions.eq("name", someArgument));  // checks  YourEntity.name 

However, if you always assign and use an alias you will be able to work around the difference. Like:

    Criteria c = getSession()       .createCriteria(YourEntity.class, "y")       .createAlias("someMember", "s")       .add(Restrictions.eq("y.name", someArgument));  // no more confusion 
like image 35
sorrymissjackson Avatar answered Oct 03 '22 03:10

sorrymissjackson