hibernate - createCriteria o createAlias?
-
23-09-2019 - |
Pregunta
Si quiero buscar aquellos estudiantes que toman la clase de "Matemáticas" y "Juan" es su grupo:
si acaso yo uso createCriteria o 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"));
cómo poner subquery1 y subquery2 junto con los criterios iniciales?
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"));
Cuando el uso de createCriteria y cuando createAlias?Creo que el juramento son los mismos...
Solución
CreateAlias y CreateCriteria son idéntico en las versiones actuales de Hibernación y Fluent.La única diferencia es que CreateCriteria tiene 2 sobrecargas adicionales sin el alias de parámetro.
Presumiblemente eran diferentes en una versión anterior, pero las diferencias se han ido.
Un alias puede ser definido en términos de otro alias, de modo que el primer ejemplo puede ser escrita como:
// 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"));
Otros consejos
Añadir a la respuesta de xavierzhoa:
En realidad, hay una gran diferencia entre los dos métodos que usted notará si encadena métodos Criteria
. Usted continuará el trabajo en el objeto Criteria
original cuando utilice createAlias
, mientras se trabaja en un alcance más anidado cuando se utiliza createCriteria
.
Considere esto:
Criteria c = getSession()
.createCriteria(YourEntity.class)
.createCriteria("someMember", "s")
.add(Restrictions.eq("name", someArgument)); // checks YourEntity.someMember.name
frente
Criteria c = getSession()
.createCriteria(YourEntity.class)
.createAlias("someMember", "s")
.add(Restrictions.eq("name", someArgument)); // checks YourEntity.name
Sin embargo, si siempre asignar y utilizar un alias que será capaz de trabajo en torno a la diferencia. Como:
Criteria c = getSession()
.createCriteria(YourEntity.class, "y")
.createAlias("someMember", "s")
.add(Restrictions.eq("y.name", someArgument)); // no more confusion
Por favor, consulte el siguiente código fuente de la hibernación
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;
}