mise en veille prolongée - createCriteria ou createAlias ?
-
23-09-2019 - |
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...
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;
}