Converter HQL em consulta por criteria

Olá a todos,

estava fazendo uma consulta na qual eu desejava que ela me retornasse todos os pedidos de alguns determinados clientes. Para isso eu informaria por parâmetro um nome do cliente (qq parte do nome) e ela me voltaria os clientes e seus respectivos pedidos.

Bom a fiz por HQL, vejam:

        String hql = "SELECT cliente " +
                " FROM Cliente as cliente, Pedido as pedido" +
                " WHERE cliente.nome like'%"+nome+"%'"+
                " AND cliente.pkCliente = pedido.cliente.pkCliente "+
                " ORDER BY cliente.nome, pedido.descricao";
        Query query = session.createQuery(hql);

Está funcionando direitinho, o relatório já está impresso e o meu chefe feliz, mas eu não!

Quero que esta query seja por criteria… mas não consegui… alquem poderia me ajudar?
Eu tentei, tentei… e não consegui, agarrei no momento em que eu devo recuperar o objeto cliente e comparar com o que eu quero do pedido. Se alguém puder ajudar escrevendo um trecho que faça isso.
Vlw

Que tipo de criteria?

Glauber, blz?

Cara, se o seu mapeamento estiver (com os dois lados das classes mapeados), fica mais ou menos assim.

[code]

public List searchByCliente(Cliente cliente){
Criteria cri = getSession().createCriteria(Pedido.class);
if(cliente!=null && cliente.getId()!=null){
// clientePedido e o atributo da classe Pedido que faz referência com cliente
cri.add(Restrictions.ilike(“clientePedido”, cliente.getnome()));
}
return cri.list();
}[/code]

Pronto, depois é só vc percorrer a lista que vc tem o s dados do Pedido e pode pegar os dados do cliente também.

*Sugestão.: Caso vc estiver fazendo um relatório cria uma classe exemplo:

public class DetailRelatorioPedido{

// atributos que vc vai utilizar no relatório
}

Depois dentro do seu BO vc realiza a pesquisa carregando o seu detail, depois é só mandar a lista para sua classe que gera o Ireport/Jasper e pronto…

Espero ter te ajudado, um abraço!!!

Tubarão UDI / MG

Hum, eu não conhecia esse Restrictions.

Bom, fiz o que você falou e ficou assim:

public List listarClientePedidos(String nome) throws HibernateException { Session session = hibernateConfiguracao.openSession(); Criteria criteria = session.createCriteria(Cliente.class); criteria.add(Restrictions.ilike("pedidos",nome)); return criteria.list(); }

Mas gerou o seguinte erro:

org.hibernate.exception.DataException: could not execute query at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:77) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.loader.Loader.doList(Loader.java:2223) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) at org.hibernate.loader.Loader.list(Loader.java:2099) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:247) at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:284) at javax.naming.InitialContext.getNameParser(InitialContext.java:439) at org.hibernate.util.NamingHelper.bind(NamingHelper.java:52) at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:90) at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:306) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294) at br.com.aplicacao.model.HibernateConfiguracao.criaSessionFactory(HibernateConfiguracao.java:39) at br.com.aplicacao.model.FactoryClass.criarDAOFactory(FactoryClass.java:26) at NewMain.main(NewMain.java:34) 4109 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 22023 4109 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Nenhum valor especificado para parâmetro 1. at br.com.aplicacao.model.dao.ClienteHibernateDAO.listarClientePedidos(ClienteHibernateDAO.java:172) at br.com.aplicacao.model.dao.controller.ClienteController.listarClientePedidos(ClienteController.java:159) at NewMain.main(NewMain.java:38) Caused by: org.postgresql.util.PSQLException: Nenhum valor especificado para parâmetro 1. at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:146) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:182) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:351) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:255) at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186) at org.hibernate.loader.Loader.getResultSet(Loader.java:1787) at org.hibernate.loader.Loader.doQuery(Loader.java:674) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.doList(Loader.java:2220) ... 8 more Exception in thread "main" java.lang.NullPointerException at NewMain.main(NewMain.java:39) Java Result: 1

Que parametro seria esse q ele fala q está faltando?

Obrigado

Glauber, blz?

Cara, essa string que vc está passando ela pode estar null, imprima ela dentro do seu método para verificar se ele está null ou não… e outra coisa verifique antes de add um Rescritions se ela não está null!

Por exemplo:

public List listarClientePedidos(String nome) throws HibernateException {   
    Session session = hibernateConfiguracao.openSession();   
    Criteria criteria = session.createCriteria(Cliente.class); 
    if(!"".equals(nome)){
       criteria.add(Restrictions.ilike("pedidos",nome));   
}
    return criteria.list();   
}  

Outra sugestão:

Pode passar o objeto Cliente como parâmetro:

public List listarClientePedidos(Cliente cliente) throws HibernateException {   
    Session session = hibernateConfiguracao.openSession();   
    Criteria criteria = session.createCriteria(Cliente.class);
    criteria.createAlias("pedidos.cliente", cli);

    if(cliente!=null && cliente.getId()!=null){
	       criteria.add(Restrictions.ilike("cli.nome",cliente.getNome());   
    }
    return criteria.list();   
}  

Qualquer coisa se não dar certo post aqui…suas classes para a gente ver a questão do mapeamento…

Um abraço,