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
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…
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?
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!