Спящий режим - создать критерии или создать Алиас? - PullRequest
26 голосов
/ 27 февраля 2010

Если я хочу найти тех студентов, которые посещают уроки «Математика» и «Джон», это его группа:

Должен ли я использовать 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? Я думаю, что будка одинакова ...

Ответы [ 3 ]

25 голосов
/ 27 февраля 2010

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"));
15 голосов
/ 28 апреля 2015

Добавление к ответу Ксавежоа:

На самом деле между этими двумя методами существует большая разница, которую вы заметите, если объедините 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
12 голосов
/ 21 января 2013

Пожалуйста, обратитесь к следующему исходному коду из 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;
}
...