proyecciones nhibernate hibernate createcriteria

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; }