Ruhezustand – createCriteria oder createAlias?
-
23-09-2019 - |
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...
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;
}