Query com muitos inner join - hql ou native query?

2 respostas
gtludwig

Pessoal,

Estou com uma questão que está me tirando o sono! Tenho que retornar um valor (int) do banco de dados (MySQL). A consulta, que funciona perfeitamente no MySQL Query Browser, é a seguinte:
SELECT COUNT(po.sequential_number) 
FROM (((scf.board board INNER JOIN scf.po po ON (board.id_po = po.id)) 
INNER JOIN scf.log log ON (log.id_po = po.id) AND (log.id_board = board.id))
INNER JOIN scf.defect_log defect_log ON (defect_log.id_log = log.id))
WHERE ((po.sequential_number LIKE [b]idPo[/b]) AND (defect_log.id_defect NOT LIKE '602060'));

Li em algum lugar que a implementação de diversos 'INNER JOIN's na mesma hql é, no mínimo, complicada e a sugestão era usar uma native query.

Mas, usando tanto hql como native query dá erro. O método usando hql é:
public int findDefectFreeBoardQuantityByPo(String idPo) {
		 StringBuilder hql = new StringBuilder();

		 hql.append("SELECT COUNT(po.sequentialNumber)"); // 32
		 hql.append(" FROM Board board INNER JOIN Po po ON board.idPo = po.id");
		 hql.append(" INNER JOIN Log log ON log.idPo = po.id AND log.idBoard = board.id");
		 hql.append(" INNER JOIN DefectLog defectLog ON defectLog.idLog = log.id AND defectLog.idDefect = '602060'");
		 hql.append(" WHERE (po.sequentialNumber) LIKE ? ");

		 Query query = getEntityManager().createQuery(hql.toString());
		 query.setParameter(1, idPo);

		 Object obj = new Object();
		 obj = query.getResultList().get(0);

		 return Integer.parseInt(obj.toString());
	}
Mas o retorno é zero. O método usando native query ficou:
@Override
	public int findDefectFreeBoardQuantityByPo(String idPo) {

		String sql = "SELECT COUNT(po.sequential_number) "
				+ "FROM (((scf.board board INNER JOIN scf.po po ON (board.id_po = po.id)) "
				+ "INNER JOIN scf.log log ON (log.id_po = po.id) AND (log.id_board = board.id)) "
				+ "INNER JOIN scf.defect_log defect_log ON (defect_log.id_log = log.id) AND (defect_log.id_defect = '602060')) "
				+ "WHERE (po.sequential_number LIKE '" + idPo + "')";

		Query query = getEntityManager().createNativeQuery(sql);

		return Integer.parseInt((String) query.getResultList().get(0).toString());
	}

Mas retorna um ClassCastException, dizendo que não pode converter de BigInteger para Integer.

Como que eu posso resolver isso?

Grato,
Gustavo

2 Respostas

luciano2

Muda seu Integer para BigInteger e retorna o intValue();

gtludwig

deu certo! thx!

Criado 11 de abril de 2011
Ultima resposta 11 de abr. de 2011
Respostas 2
Participantes 2