hibernate - createCriteria o CREATEALIAS?
-
23-09-2019 - |
Domanda
Se voglio cercare quegli studenti che prendono di classe "Math" e "John" è il suo gruppo:
shoud 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 a 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? Credo che il Boath sono gli stessi ...
Soluzione
CREATEALIAS e createCriteria sono identica nelle versioni attuali 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 lontani.
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"));
Altri suggerimenti
L'aggiunta alla risposta di xavierzhoa:
Non è in realtà piuttosto una grande differenza tra i due metodi che si noterà se si concatenano metodi Criteria
. Si continuerà a lavorare sull'oggetto Criteria
originale quando si utilizza createAlias
, mentre si lavora su un ambito di applicazione più nidificato quando si utilizza createCriteria
.
Considerate questo:
Criteria c = getSession()
.createCriteria(YourEntity.class)
.createCriteria("someMember", "s")
.add(Restrictions.eq("name", someArgument)); // checks YourEntity.someMember.name
vs
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
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;
}