Спящий режим - создать критерии или создать Алиас?
Если я хочу найти тех учеников, которые берут уроки "Математика" и "Джон", это его группа:
я должен использовать createCriteria или 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"));
как поставить подзапрос1 и подзапрос2 вместе с начальными критериями?
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"));
Когда использовать createCriteria, а когда createAlias? Я думаю, что кабина одинаковы...
4 ответа
CreateAlias и CreateCriteria идентичны в текущих версиях Hibernate и NHibernate. Единственное отличие состоит в том, что CreateCriteria имеет 2 дополнительные перегрузки без параметра alias.
Предположительно они были другими в более старой версии, но никаких различий давно уже нет.
Псевдоним может быть определен в терминах другого псевдонима, поэтому ваш первый пример может быть записан как:
// 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"));
Добавление к ответу Ксавежоа:
Существует на самом деле довольно большая разница между этими двумя методами, которые вы заметите, если цепочка Criteria
методы. Вы будете продолжать работать над оригиналом Criteria
объект при использовании createAlias
в то время как вы используете более вложенную область при использовании createCriteria
,
Учти это:
Criteria c = getSession()
.createCriteria(YourEntity.class)
.createCriteria("someMember", "s")
.add(Restrictions.eq("name", someArgument)); // checks YourEntity.someMember.name
против
Criteria c = getSession()
.createCriteria(YourEntity.class)
.createAlias("someMember", "s")
.add(Restrictions.eq("name", someArgument)); // checks YourEntity.name
Однако, если вы всегда назначаете и используете псевдоним, вы сможете обойти эту разницу. Подобно:
Criteria c = getSession()
.createCriteria(YourEntity.class, "y")
.createAlias("someMember", "s")
.add(Restrictions.eq("y.name", someArgument)); // no more confusion
Пожалуйста, обратитесь к следующему исходному коду из Hibernate
public Criteria createCriteria(String associationPath, String alias, int joinType) {
return new Subcriteria( this, associationPath, alias, joinType );
}
public Criteria createAlias(String associationPath, String alias, int joinType) {
new Subcriteria( this, associationPath, alias, joinType );
return this;
}
Criteria criteria = (Criteria)sessionFactory.getCurrentSession().createCriteria(BillEntity.class)
.createAlias("worksEntity", "worksEntity" ,JoinType.LEFT_OUTER_JOIN)
вместо записи (Jointype) используйте файл импорта как
(org.hibernate.sql.JoinType..LEFT_OUTER_JOIN)