Last active
January 17, 2023 14:26
-
-
Save rponte/1351603 to your computer and use it in GitHub Desktop.
HQL vs Criteria example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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(); |
Author
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).
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.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
De nada :P