Query Hibernate

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:

	String select = " 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_

where documentpa1_.iPartID=part4_.iPartID 
	and documentpa1_.iPartTypeID=parttype3_.iPartTypeID
	and (documentpa1_.iDocID in (? , ?)) 
	and part4_.vc20CpfCnpj=? 

group by parttype0_.iPartTypeID , parttype0_.vc15PartCode , parttype0_.vc50Part 
	having count(parttype0_.iPartTypeID)=?

Olá, bem vindo.

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.

Filipe, antes de qualquer coisa obrigado pela prontidão de sua resposta.

Eu já tinha postado anteriormente a query gerada pelo hibernate:

[STDOUT] Hibernate: select parttype0_.iPartTypeID as iPartTyp1_10_, parttype0_.vc50Part as vc2_10_, parttype0_.vc15PartCode as vc3_10_ from tPartType parttype0_, tDocPart documentpa1_, tPart part2_, tPart part3_ where documentpa1_.iPartID=part3_.iPartID and parttype0_.iPartTypeID=documentpa1_.iPartTypeID and part2_.iPartID=documentpa1_.iPartID and (documentpa1_.iDocID in (? , ?)) and part3_.vc20CpfCnpj=? group by parttype0_.iPartTypeID , parttype0_.vc15PartCode , parttype0_.vc50Part having count(parttype0_.iPartTypeID)=?

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.

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() );

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:

		String select = " 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 (Iterator iter = 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?

		String select = " 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 ";
		
		Session session = super.getSession();
		try {
			Query qry = session.createQuery(select);
			qry.setParameterList("pDocIds", docIds);
			qry.setSerializable("pCpfCnpj", cpfCnpj);
			qry.setInteger("pNumIds", docIds.size());
			
			List lista = qry.list();
			return lista;
		} finally {
			 session.close();
		}

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?

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 !! :smiley:

PS.: Esse método Query.setSerializable(), quando usar ??

\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 :smiley: