Estou com o seguinte problema:
Executo uma query no hibernate e ela me retorna uma lista vazia, porém quando eu coloco a query no Query Analyzere seto os parametros ela me retorna uma linha.
A Query eh a seguint:
Stringselect=" select type";select+=" from PartType type, DocumentPart docPart, Part part";select+=" where type = docPart.partType";select+=" and part = docPart.part";select+=" and docPart.doc.docId in (:pDocIds) ";select+=" and docPart.part.cpfCnpj= :pCpfCnpj ";select+=" group by type.partTypeId, type.partCode, type.part ";select+=" having count(type.partTypeId)= :pNumIds ";
o sql gerado, que esta correto e retorna uma linha eh o seguint:
select parttype3_.iPartTypeID as iPartTyp1_10_, parttype3_.vc50Part as vc2_10_, parttype3_.vc15PartCode as vc3_10_
from tPartType parttype0_, tDocPart documentpa1_, tPartType parttype3_
Vejamos se entendi: se você copia o sql gerado pelo Hibernate e o executa no QueryAnalyzer, uma linha é retornada. Mas esta mesma query executada pelo Hibernate retorna uma lista vazia?
Se é isso, tem certeza que os parâmetros que populam a query no Hibernate são os mesmos que colocou no QueryAnalyzer? Pode verificar isso adicionando:
log4j.logger.org.hibernate.type=DEBUG
no log4j.properties.
G
grustk
Filipe, antes de qualquer coisa obrigado pela prontidão de sua resposta.
Eu já tinha postado anteriormente a query gerada pelo hibernate:
acredito que os valores estejam correntos pois eu executo como debug e verifico os valores de cada uma das variáveis, e são esses os valores que eu seto no Query Analyzer.
_fs
Bom, então a única opção que consigo pensar é que o Hibernate está buscando em um banco diferente do QueryAnalyzer. Já cometi este erro hehe
Mas tenha certeza mais-que-absoluta que os filtros executados são os mesmos. Recomendo até que retire a cláusula WHERE para realizar o teste.
Só para desencargo de consciência, o código está mais ou menos assim, certo?
Query q = session.createQuery( s );
// seta os parâmetros
List l = q.list();
System.out.println( l.size() );
G
grustk
Surgiu uma outra dúvida. Testei para ter certeza, como o Filipe havia dito, não usar parametros e setar os valores direto na string:
Stringselect=" select type ";select+=" from PartType type, DocumentPart docPart, Part part ";select+=" where type = docPart.partType ";select+=" and part = docPart.part ";select+=" and docPart.doc.docId in ( ";for(Iteratoriter=docIds.iterator();iter.hasNext();){select+=iter.next().toString();if(iter.hasNext()){select+=" , ";}else{select+=" ) ";}}select+=" and docPart.part.cpfCnpj="+cpfCnpj;select+=" group by type.partTypeId, type.partCode, type.part ";select+=" having count(type.partTypeId)= "+docIds.size();
Agora funcionou! Então o que eu estou fazendo de errado na hora de setar os parametros?
Stringselect=" select type ";select+=" from PartType type, DocumentPart docPart, Part part ";select+=" where type = docPart.partType ";select+=" and part = docPart.part ";select+=" and docPart.doc.docId in (:pDocIds) ";select+=" and docPart.part.cpfCnpj= :pCpfCnpj ";select+=" group by type.partTypeId, type.partCode, type.part ";select+=" having count(type.partTypeId)= :pNumIds ";Sessionsession=super.getSession();try{Queryqry=session.createQuery(select);qry.setParameterList("pDocIds",docIds);qry.setSerializable("pCpfCnpj",cpfCnpj);qry.setInteger("pNumIds",docIds.size());Listlista=qry.list();returnlista;}finally{session.close();}
_fs
Há uma chance esmagadora de não haver registro que responda ao filtro aplicado hehe
Mas fiquei curioso com este Query.setSerializable(), não lembro de usá-lo. Tem certeza que funciona como esperado?
G
grustk
LIPE
Maravilha … funcionou… era o Query.setSerializable() mesmo. Eu esperava que o hibernate chamasse o método toString(), retornando portanto o próprio objeto (String cpfCnpj). :x
Muito Obrigado !!
PS.: Esse método Query.setSerializable(), quando usar ??
_fs
\o/
Bom, não sei o que é este método faz. Não tem javadoc e não há menção no Hibernate in Action hehe.
Fiquei curioso e fui ver os fontes. Cheguei na classe org.hibernate.type.SerializableType, que o que faz é … serializar e deserializar o objeto passado como argumento hehe
Em suma: o Hibernate estava colocando os bytes do objeto CpfCnpj como parâmetro na query, o que não ajuda, presumo