Pergunta

Se eu quiser pesquisar aqueles alunos que fazem aulas "Math" e "John" é seu grupo:

Shoud eu uso createCriteria ou credealias?

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

Como montar Subquery1 e Subquery2 juntamente com os critérios iniciais?

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 usar o CreateCriteria e quando os createalias? Eu acho que o boath é o mesmo ...

Foi útil?

Solução

Credealias e createCriteria são idêntico Nas versões atuais de Hibernate e Nibernate. A única diferença é que o CreateCriteria possui 2 sobrecargas adicionais sem o parâmetro Alias.

Presumivelmente, eles eram diferentes em uma versão mais antiga, mas quaisquer diferenças se foram há muito tempo.

Um pseudônimo pode ser definido em termos de outro pseudônimo, para que seu primeiro exemplo possa ser escrito como:

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

Outras dicas

Adicionando à resposta de Xavierzhoa:

Na verdade, há uma grande diferença entre os dois métodos que você notará se você formar Criteria métodos. Você continuará trabalhando no original Criteria objeto ao usar createAlias, enquanto você trabalha em um escopo mais aninhado ao usar createCriteria.

Considere isto:

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

contra

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

No entanto, se você sempre atribuir e usar um alias, poderá contornar a diferença. Curti:

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

Consulte o seguinte código -fonte do hibernato

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top