web-dev-qa-db-fra.com

hibernate - createCriteria ou createAlias?

Si je veux rechercher les étudiants qui prennent la classe "Math" 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 mettre 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 le boath est le même ...

26
senzacionale

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

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

Un alias peut être défini en termes d'un autre alias, donc votre premier exemple peut être écrit 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"));
25
Lachlan Roche

Ajout à la réponse de xavierzhoa:

Il existe en fait une grande différence entre les deux méthodes que vous remarquerez si vous enchaînez les méthodes Criteria. Vous continuerez à travailler sur l'objet Criteria d'origine lorsque vous utilisez createAlias, tandis que vous travaillez sur une étendue plus imbriquée lorsque vous utilisez createCriteria.

Considère ceci:

    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

Cependant, si vous attribuez et utilisez toujours un alias, vous pourrez contourner la différence. Comme:

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

Veuillez vous 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;
}
12
xavierzhao