Skip to content

Instantly share code, notes, and snippets.

@rponte
Last active January 17, 2023 14:26
Show Gist options
  • Select an option

  • Save rponte/1351603 to your computer and use it in GitHub Desktop.

Select an option

Save rponte/1351603 to your computer and use it in GitHub Desktop.
HQL vs Criteria example
Criteria criteria = getSession().createCriteria(PagueLeve.class);
criteria.createAlias("itens", "itens", Criteria.INNER_JOIN);
criteria.add(Restrictions.ge("dataFinal", venda.getInicio())) // start1 <= end2
.add(Restrictions.le("dataInicial", venda.getFim())) // start2 <= end1
.add(Restrictions.in("itens.codigo", venda.getCodigosDosProdutosAssociados()));
criteria.setProjection(Projections.distinct(
Projections.projectionList()
.add(Projections.property("codigo").as("codigo"))
.add(Projections.property("descricao").as("descricao"))
.add(Projections.property("dataInicial").as("dataInicial"))
.add(Projections.property("dataFinal").as("dataFinal"))
));
criteria.setResultTransformer(Transformers.aliasToBean(PagueLeve.class));
List conflitos = criteria.list();
List conflitos = getSession()
.createQuery("select distinct p.codigo as codigo, p.descricao as descricao, p.dataInicial as dataInicial, p.dataFinal as dataFinal " +
"from PagueLeve p " +
"inner join p.itens as item " +
"where " +
"p.dataFinal >= :inicio " +
"and p.dataInicial <= :fim " +
"and item.codigo in (:produtos)")
.setParameter("inicio", venda.getInicio()) // start1 <= end2
.setParameter("fim", venda.getFim()) // start2 <= end1
.setParameterList("produtos", venda.getCodigosDosProdutosAssociados())
.setResultTransformer(Transformers.aliasToBean(PagueLeve.class))
.list();
Criteria criteria = getSession().createCriteria(VendaCasada.class)
.add(Restrictions.idEq(codigo))
.createAlias("lojas", "loja", Criteria.LEFT_JOIN)
.add(Restrictions.not(
Restrictions.in("loja.codigo", new Integer[]{2,3})
)
);
criteria.setProjection(
Projections.projectionList()
.add(Projections.property("loja.codigo"), "codigo")
.add(Projections.property("loja.nome"), "nome")
);
criteria.setResultTransformer(Transformers.aliasToBean(Loja.class));
List<Loja> l = criteria.list();
List<Loja> l = entityManager
.createQuery("select loja " +
"from VendaCasada venda " +
"left join venda.lojas as loja " +
"where venda.codigo = :codigo " +
" and loja not in (:lojas)")
.setParameter("codigo", codigo)
.setParameter("lojas", lojas)
.getResultList();
DetachedCriteria criteria = DetachedCriteria.forClass(CargaHoraria.class, "carga");
criteria.createAlias("carga.fisioterapeuta", "fisioterapeuta", Criteria.INNER_JOIN);
criteria.createAlias("carga.diasDaSemana", "dia", Criteria.LEFT_JOIN);
criteria.add(Restrictions.eq("carga.ativa", 0)); // 0 = ativa ou inativa?????
criteria.add(Restrictions.eq("fisioterapeuta.franquiaId", securityHelper.getFranquiaIdDoUsuarioLogado()));
criteria.add(Restrictions.in("dia.diaSemana", diasSemana));
if (turnos != null) {
// usando a disjunction para fazer um 'ou' entre vários elementos
Disjunction ou = Restrictions.disjunction();
for (Turnos turno : turnos) {
ou.add(Restrictions.between("carga.horarioInicial", turno.getHoraInicial(), turno.getHoraFinal()));
ou.add(Restrictions.between("carga.horarioFinal", turno.getHoraInicial(), turno.getHoraFinal()));
}
criteria.add(ou);
}
criteria.setProjection(Projections.distinct(Projections.property("carga.codigo")));
// not necessary because you're using detached criteria
//criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Criteria _criteria = createCriteria(CargaHoraria.class, "carga");
_criteria.add(Property.forName("codigo").in(criteria));
_criteria.setFetchMode("fisioterapeuta", FetchMode.SELECT);
_criteria.setFetchMode("fisioterapeuta.calendario", FetchMode.SELECT);
_criteria.setFetchMode("fisioterapeuta.calendario.eventos", FetchMode.SELECT);
_criteria.setFetchMode("diasDaSemana", FetchMode.SELECT);
_criteria.setFetchMode("diasDaSemana.cargaHoraria", FetchMode.SELECT);
List<CargaHoraria> recordList = _criteria.list();
@rponte
Copy link
Author

rponte commented Dec 20, 2011

Só para salientar, a diferença de performance entre Criteria e HQL por causa do parsing é provavelmente, como o próprio autor da resposta comenta, o menos gritante quanto ao assunto performance.

Antes de se preocupar se Criteria é mais performático que HQL é melhor se preocupar em habilitar second level cache, query cache, batch size e certamente otimizar a query (consulta).

@levymoreira
Copy link

Ok, obrigado. Estou fazendo minha primeira aplicação web e estou utilizando o hibernate, alguns dos pontos que sitou ainda não conheço mais vou estudar.

@rponte
Copy link
Author

rponte commented Feb 18, 2014

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment