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...

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top