Question

Si je veux rechercher les étudiants qui suivent le cours « Maths » et « John » est son groupe :

dois-je utiliser createCriteria ou 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"));

comment regrouper sous-requête1 et sous-requête2 avec les critères initiaux ?

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"));

Quand utiliser createCriteria et quand createAlias ?Je pense que les bateaux sont les mêmes...

Était-ce utile?

La solution

CreateAlias ​​et CreateCriteria sont identique dans les versions actuelles d'Hibernate et NHibernate.La seule différence étant que CreateCriteria possède 2 surcharges supplémentaires sans le paramètre alias.

Vraisemblablement, ils étaient différents dans une ancienne version, mais les différences ont disparu depuis longtemps.

Un alias peut être défini en termes d'un autre alias, votre premier exemple peut donc s'écrire comme suit :

// 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"));

Autres conseils

Ajout à la réponse de xavierzhoa:

Il est en fait assez grande différence entre les deux méthodes que vous remarquerez si vous enchaînez les méthodes de Criteria. Vous allez continuer à travailler sur l'objet Criteria d'origine lors de l'utilisation createAlias, alors que vous travaillez sur une portée plus imbriquée lors de l'utilisation createCriteria.

Considérez ceci:

    Criteria c = getSession()
      .createCriteria(YourEntity.class)
      .createCriteria("someMember", "s")
      .add(Restrictions.eq("name", someArgument));  // checks YourEntity.someMember.name

contre

    Criteria c = getSession()
      .createCriteria(YourEntity.class)
      .createAlias("someMember", "s")
      .add(Restrictions.eq("name", someArgument));  // checks  YourEntity.name

Cependant, si vous attribuez et utilisez toujours un alias que vous serez en mesure de travailler autour de la différence. Comme:

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

S'il vous plaît se référer au code source suivant de la mise en veille prolongée

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top