Frage

Wenn ich die Schüler suchen möchte, die den Kurs „Mathe“ belegen und „John“ seine Gruppe ist:

Soll ich createCriteria oder createAlias ​​verwenden?

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"));

Wie füge ich Unterabfrage1 und Unterabfrage2 mit den Anfangskriterien zusammen?

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"));

Wann sollte „createCriteria“ und wann „createAlias“ verwendet werden?Ich denke, die Boote sind gleich...

War es hilfreich?

Lösung

CreateAlias ​​und CreateCriteria sind identisch in den aktuellen Versionen von Hibernate und NHibernate.Der einzige Unterschied besteht darin, dass CreateCriteria zwei zusätzliche Überladungen ohne den Alias-Parameter hat.

Vermutlich waren sie in einer älteren Version anders, aber alle Unterschiede sind längst verschwunden.

Ein Alias ​​kann in Bezug auf einen anderen Alias ​​definiert werden, sodass Ihr erstes Beispiel wie folgt geschrieben werden kann:

// 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"));

Andere Tipps

Ergänzung zu xavierzhoas Antwort:

Es gibt tatsächlich einen ziemlich großen Unterschied zwischen den beiden Methoden, den Sie bei der Verkettung bemerken werden Criteria Methoden.Sie werden weiterhin am Original arbeiten Criteria Objekt bei der Verwendung createAlias, wohingegen Sie bei der Verwendung mit einem stärker verschachtelten Bereich arbeiten createCriteria.

Bedenken Sie:

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

gegen

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

Wenn Sie jedoch immer einen Alias ​​zuweisen und verwenden, können Sie den Unterschied umgehen.Wie:

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

Bitte beachten Sie den folgenden Quellcode vom 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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top