Спящий режим - создать критерии или создать Алиас?

Если я хочу найти тех учеников, которые берут уроки "Математика" и "Джон", это его группа:

я должен использовать 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)
Другие вопросы по тегам