2010-02-27 6 views
25

Si je veux rechercher ces étudiants qui prennent la classe "Math" et "John" est son groupe:hibernate - createCriteria ou createAlias?

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 subquery1 et subquery2 ensemble 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 boath sont les mêmes ...

+0

Je ne sais pas si c'était une question Java/Hibernate ou C#/NHibernate, donc j'ai répondu pour les deux. –

+2

il existe des différences subtiles entre CreateCriteria et CreateAlias, chacun a un but. Vérifiez ma réponse à http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs-createalias/921042#921042 Ceci est en fait une question en double – Jaguar

Répondre

24

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

On peut supposer qu'ils étaient différents dans une version plus ancienne, mais toutes les différences ont disparu depuis longtemps.

Un alias peut être défini en termes d'un autre alias, de sorte que votre premier exemple peut être écrit:

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

désolé n'a pas dit que j'utilise nhibernate pour C# . Donc, si je ne corrige pas correctement, createAlias ​​est le même que createCriteria, mais createCriteria peut utiliser une jointure différente, mais createAlias ​​ne peut utiliser que la jointure interne. Ai-je raison? – senzacionale

+0

@senzacionale Le paramètre JoinType est disponible via les deux noms de méthodes. –

+4

ils ne sont pas la même chose notez que CreateCriteria expose un objet ICriteria qui peut être manipulé en plus de l'objet ICRiteria "root" vérifier ma réponse à http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs- createalias/921042 # 921042 – Jaguar

11

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

Ajout à La réponse de xavierzhoa:

Il existe en fait une grosse différence entre les deux méthodes que vous remarquerez si vous enchaînez les méthodes Criteria. Vous continuerez à travailler sur l'objet original Criteria lors de l'utilisation de createAlias, alors que vous travaillez sur une portée plus imbriquée lorsque vous utilisez 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 
Questions connexes