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

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top