-
-
Save rponte/1351603 to your computer and use it in GitHub Desktop.
| 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(); |
O que eu acho de não ser string based e forma de fazer algo é que torna menos sussetivel a erro.
Se tu errar uma letrinha ai já era, so em run time, ja usando criteria tu nem compila teu código :).
Por isso cobrimos direitinho com testes de integração :-)
Só uma dúvida, como você acompanha meus gists e comentários? Via RSS/Atom?
Próprio github te manda email
Eu uso Gmail notifier ai fica facil
No quesito desempenho, ambas as formas tem a mesma agilidade?
Criteria é mais rapido, pois não necessita fazer parse de string, mas creio que haja uma diferença tão grande entre o tempo de uma e outra.
Outro detalhe é que com criteria é possivel fazer cache em segundo nivel, já hql não.
http://stackoverflow.com/questions/4401240/criteria-v-s-hql-who-is-faster
Obrigado Alberto.
De nada :P
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.
Hahaha, mas tem coisas no HQL que ficam mais legíveis que no Criteria, principalmente porque a maioria dos devs manjam algo de SQL.
Mas o inverso também acontece, certas queries com Criteria ficam melhores do que com HQL, principalmente as bem dinâmicas.