2010-02-27 12 views
25

Si quiero buscar a los estudiantes que toman clases "Matemáticas" y "Juan" es su grupo:hibernate - createCriteria o createAlias?

shoud ¿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 utilizar createCriteria y cuándo crearAlias? Creo que los boath son los mismos ...

+0

No estoy seguro de si se trataba de una pregunta de Java/Hibernate o C#/NHibernate, por lo que he respondido por ambas. –

+2

hay diferencias sutiles entre CreateCriteria y CreateAlias, cada una tiene un propósito. Compruebe mi respuesta en http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs-createalias/921042#921042 Esto es en realidad una pregunta duplicada – Jaguar

Respuesta

24

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.

Es de suponer que eran diferentes en una versión anterior, pero las diferencias se han ido.

Un alias puede ser definido 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")); 
+0

lo siento, no le dije que estoy usando nhibernate para C# . Por lo tanto, si no entiendo correctamente createAlias ​​es lo mismo que createCriteria, createCriteria puede usar join diferente pero createAlias ​​solo puede usar inner join. Estoy en lo correcto? – senzacionale

+0

@senzacionale El parámetro JoinType está disponible a través de ambos nombres de métodos. –

+4

no son lo mismo tenga en cuenta que CreateCriteria expone un objeto ICriteria que se puede manipular además del objeto "raíz" ICriteria verifique mi respuesta en http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs- createalias/921042 # 921042 – Jaguar

11

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

Agregando a Respuesta de xavierzhoa:

En realidad, hay una gran diferencia entre los dos métodos que notará si encadena los métodos Criteria. Continuará trabajando en el objeto original Criteria al usar createAlias, mientras que trabaja en un ámbito más anidado cuando usa createCriteria.

Considera:

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 se asigna y utiliza un alias que será capaz de trabajar en torno a la diferencia. Me gusta:

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