2010-02-27 11 views
25

Se voglio cercare quegli studenti che prendono classe "Math" e "John" è il suo gruppo:hibernate - createCriteria o createAlias?

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

come mettere subquery1 e subquery2 insieme con i criteri iniziali?

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

Quando usare createCriteria e quando CREATEALIAS? Penso che il boath sia lo stesso ...

+0

Non sono sicuro se questo fosse un Java/Hibernate o un C#/domanda NHibernate, così ho risposto per entrambi. –

+2

ci sono sottili differenze tra CreateCriteria e CreateAlias, ognuna ha uno scopo. Controlla la mia risposta su http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs-createalias/921042#921042 Questa è in realtà una domanda duplicata – Jaguar

risposta

24

CreateAlias ​​e CreateCriteria sono identiche a nelle versioni correnti di Hibernate e NHibernate. L'unica differenza è che CreateCriteria ha 2 sovraccarichi aggiuntivi senza il parametro alias.

Presumibilmente erano diversi in una versione precedente, ma le differenze sono ormai lontane.

Un alias può essere definito in termini di un altro alias, in modo che il primo esempio può essere scritta come:

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

scusa non ti ho detto che sto usando Nhibernate per C# . Quindi se non riesco a creare correttamente Elias è lo stesso di createCriteria, ma createCriteria può usare join diversi ma createAlias ​​può usare solo inner join. Ho ragione? – senzacionale

+0

@senzacionale Il parametro JoinType è disponibile tramite entrambi i nomi dei metodi. –

+4

non sono la stessa cosa nota che CreateCriteria espone un oggetto ICriteria che può essere modificato oltre l'oggetto "root" ICriteria controlla la mia risposta a http://stackoverflow.com/questions/899079/nhibernate-createcriteria-vs- createalias/921042 # 921042 – Jaguar

11

Si prega di fare riferimento al seguente codice sorgente dal Hibernate

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

Aggiungendo La risposta di xavierzhoa:

C'è in realtà una grande differenza tra i due metodi che noterete se si concatenano i metodi Criteria. Continuerai a lavorare sull'oggetto originale Criteria quando usi createAlias, mentre lavori su un ambito più nidificato quando usi createCriteria.

Considerate questo:

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

contro

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

Tuttavia, se si assegna sempre e utilizzare un alias che si sarà in grado di aggirare la differenza. Come:

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