nhibernate - proyecciones - hibernate-createCriteria o createAlias?
criteria hibernate (3)
Añadiendo a la respuesta de xavierzhoa:
En realidad, existe una gran diferencia entre los dos métodos que notará si encadena Criteria
métodos de Criteria
. Continuará trabajando en el objeto Criteria
original cuando use createAlias
, mientras que usted trabaja en un ámbito más anidado al usar createCriteria
.
Considera esto:
Criteria c = getSession()
.createCriteria(YourEntity.class)
.createCriteria("someMember", "s")
.add(Restrictions.eq("name", someArgument)); // checks YourEntity.someMember.name
versus
Criteria c = getSession()
.createCriteria(YourEntity.class)
.createAlias("someMember", "s")
.add(Restrictions.eq("name", someArgument)); // checks YourEntity.name
Sin embargo, si siempre asigna y usa un alias, podrá evitar la diferencia. Me gusta:
Criteria c = getSession()
.createCriteria(YourEntity.class, "y")
.createAlias("someMember", "s")
.add(Restrictions.eq("y.name", someArgument)); // no more confusion
Si quiero buscar a los alumnos que toman la clase "Matemáticas" y "Juan" es su grupo:
shoud 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"));
¿Cuándo usar createCriteria y cuándo crearAlias? Creo que los boath son lo mismo ...
CreateAlias y CreateCriteria son idénticos en las versiones actuales de Hibernate y NHibernate. La única diferencia es que CreateCriteria tiene 2 sobrecargas adicionales sin el parámetro alias.
Presumiblemente, eran diferentes en una versión anterior, pero las diferencias desaparecieron hace mucho tiempo.
Un alias se puede definir en términos de otro alias, por lo que su primer ejemplo se puede escribir 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"));
Por favor, consulte el siguiente código fuente de 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;
}