Hibernato - CreateCriteria ou CreateEalias?
-
23-09-2019 - |
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 ...
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;
}