Hibernate - Criteria - Duvidas

7 respostas
L

Bom dia galera. Estou trabalhando com hibernate a uma semana, e estou com um problema aqui que está me deixando perdido e esse é o SQL mais simples que tenho que converter para hibernate!

Não é vantagem utilizar HQL por que estou justamente me livrando de funções nativas. Os proximos sql’s tem muitas funções, create views etc.
Desejo fazer uma critéria que execute o seguinte sql:

SELECT a, b, c, d, e,
SUM(x1 * x2) AS totalX
FROM tabela1
WHERE datas BETWEEN ? AND ?
AND a = ?
AND b = ?
AND c = ?
AND d not in (select d from tabela2)
AND e like 'e’
GROUP BY a, b, c, d, e, datas
ORDER BY a

Estou tentando Projections, Restrictions, Criteria, CriteriaBuilder, DetachedCriteria, mas até agora nada!
O complicado está no calculo e no subselect.

Se alguem puder me ajudar, agradeço. Se alguem tiver um bom tutorial sobre isso, tb agradeço

7 Respostas

L

Alguém??

emanuelCruz

Eu utilizaria HQL. Não entendi o argumento quanto a funções nativas.

Sinceramente não gosto de Criteria pois considero muito ilegível.

Igor_Gabriel

Transformar essa query em criteria vai ser bem complicadinho hein.
Talvez possa ajudar:

http://blog.caelum.com.br/divisions-com-hibernate-uso-avancado-da-criteria-api/
http://www.roseindia.net/hibernate/examples/criteria/sum.html
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

Boa sorte.

L

São consultas de relatórios. Tem uma classe especifica pra cada banco, justamente por que usa muitas funções em cada consulta.
Funções de conversão de data, de criação de views, subselect’s, inners, max, mim. decode (CASE, THEN, ELSE, caso SQLServer).

Então, sou novato em hibernate, mas pelo que li e entendi, hql aceita funções nativas de banco.
O criteria interpreta essas funções para qualquer banco, pois não usa linguagem exclusiva de nenhum banco. (Posso estar errado).

Estou fazendo algo parecido com isso.

SQL normal

SELECT a, b, c, d, datas
SUM(x1 * x2) AS totalX
FROM tabela1
WHERE datas BETWEEN ? AND ?
AND a = ?
AND b = ?
AND c = ?
AND d not in (select d from tabela2)
AND d like 'd’
GROUP BY a, b, c, d, datas
ORDER BY a

Criteria

Session session = factory.openSession();

Criteria criteria = session.createCriteria(ArquivosImpressos.class);

criteria.add(Restrictions.between(“datas”, objeto.getDataInicial(), objeto.getDataFinal()));

criteria.add(Restrictions.ilike(“a”, objeto.getA()));

criteria.add(Restrictions.ilike(“b”, objeto.getB, MatchMode.ANYWHERE));

ProjectionList projectionList = Projections.projectionList();

projectionList.add(Projections.sqlGroupProjection(“SUM(x1 * x2) as total”, “total”, new String[] { “total” }, new Type[] { Hibernate.LONG }));

criteria.setProjection(projectionList);

criteria.addOrder(Order.asc(“a”));

List lista = criteria.list();
dtxk

Leandro Ricardo:
São consultas de relatórios. Tem uma classe especifica pra cada banco, justamente por que usa muitas funções em cada consulta.
Funções de conversão de data, de criação de views, subselect’s, inners, max, mim. decode (CASE, THEN, ELSE, caso SQLServer).

Então, sou novato em hibernate, mas pelo que li e entendi, hql aceita funções nativas de banco.
O criteria interpreta essas funções para qualquer banco, pois não usa linguagem exclusiva de nenhum banco. (Posso estar errado).

Estou fazendo algo parecido com isso.

SQL normal

SELECT a, b, c, d, datas
SUM(x1 * x2) AS totalX
FROM tabela1
WHERE datas BETWEEN ? AND ?
AND a = ?
AND b = ?
AND c = ?
AND d not in (select d from tabela2)
AND d like 'd’
GROUP BY a, b, c, d, datas
ORDER BY a

Criteria

Session session = factory.openSession();

Criteria criteria = session.createCriteria(ArquivosImpressos.class);

criteria.add(Restrictions.between(“datas”, objeto.getDataInicial(), objeto.getDataFinal()));

criteria.add(Restrictions.ilike(“a”, objeto.getA()));

criteria.add(Restrictions.ilike(“b”, objeto.getB, MatchMode.ANYWHERE));

ProjectionList projectionList = Projections.projectionList();

projectionList.add(Projections.sqlGroupProjection(“SUM(x1 * x2) as total”, “total”, new String[] { “total” }, new Type[] { Hibernate.LONG }));

criteria.setProjection(projectionList);

criteria.addOrder(Order.asc(“a”));

List lista = criteria.list();</blockquote>

Estava atras de subselect e a unica forma que consegui foi usando o “@Formula” como segue no esquema abaixo:

espero que lhe ajude

L

Mais alguem para contribuir com a solução?

emanuelCruz

Cara, hql tambem é independente de banco, afinal HQL = Hibernate Query Language.

Ao meu ver uma consulta não trivial como esta, seria pura dor de cabeça com criteria … tanto na criação quanto na manutenção (horrível de interpretar)

Criado 28 de novembro de 2011
Ultima resposta 29 de nov. de 2011
Respostas 7
Participantes 4