Ajuda com subquery - Criteria

6 respostas
J

Estou com o seguinte erro nessa Criteria que utiliza subquery;

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

Meu Criteria é essa

DetachedCriteria dc = DetachedCriteria.forClass(Tramitacao.class, "t2");
				dc.setProjection(Projections.max("t2.comentario"));
				dc.add(Restrictions.idEq("s.codigo"));
				
		Criteria c = session.createCriteria(Solicitacao.class,"s");
				c.createAlias("s.tramitacao","tramitacao",JoinType.INNER_JOIN)
				.createAlias("tramitacao.tipoestado","tipoEstado",JoinType.INNER_JOIN)
				.add(Subqueries.in("tramitacao.codigo", dc));

O erro ocorre justamente nesse ponto:

.add(Subqueries.in("tramitacao.codigo", dc));

Se eu tentar comparar string, ele executa corretamente, porém quando tento compar os codigo que é um integer com um conjuto de codigo(s) que são integer ai ocorre o erro mencionado acima, o que poderia ser ? tenho que fazer cast ?

6 Respostas

fabiozanardi

o erro nao parece ser na subquery, mas apenas no atributo que está passando

ele está tentando dar um cast de string para integer,

qual o tipo dessa variavel dc?

J

fabiozanardi:
o erro nao parece ser na subquery, mas apenas no atributo que está passando

ele está tentando dar um cast de string para integer,

qual o tipo dessa variavel dc?

a variavel dc tá declarada na parte inicial do código

DetachedCriteria dc

Dei uma melhorada no código para ficar tudo junto:

Criteria c = session.createCriteria(Solicitacao.class,"s");
				c.createAlias("s.tramitacao","tramitacao",JoinType.INNER_JOIN)
				.createAlias("tramitacao.tipoestado","tipoEstado",JoinType.INNER_JOIN)
				.add(Subqueries.in("tramitacao.codigo",DetachedCriteria.forClass(Tramitacao.class,"t2")
						.setProjection(Projections.max("t2.codigo")).add(Restrictions.idEq("s.codigo"))));

Esse aqui é o que aparece no log

select
        count(*) as y0_ 
    from
        sic.solicitacao this_ 
    inner join
        sic.tramitacao tramitacao1_ 
            on this_.codigo=tramitacao1_.codigo_solicitacao 
    inner join
        sic.tipoestado tipoestado2_ 
            on tramitacao1_.codigo_tipoestado=tipoestado2_.codigo 
    where
        ? in (
            select
                max(t2_.codigo) as y0_ 
            from
                sic.tramitacao t2_ 
            where
                t2_.codigo = ?
        )
AnjoVingador

Você já tentou executar somente a subquery?Se não tentou tente para ver se o problema é só nela mesmo.
Seu “s.codigo” é String ou Integer?

J

AnjoVingador:
Você já tentou executar somente a subquery?Se não tentou tente para ver se o problema é só nela mesmo.
Seu “s.codigo” é String ou Integer?

o s.codigo é um INTEGER , tramitacao.codigo é um INTEGER tbem,

Como executar só a subquery ? esse s.codigo é da subquery externa, ai fica dificil executar separado!!

se eu substituir o IN por um Exists ele roda, porém ao colocar o IN, NÃO RODA

J

Utilizando o IN eu posso utilizar um campo externo na busca interna ?

J

Resolvido…

O correto era eu ter usado

Subqueries.propertyIn

Criado 4 de julho de 2012
Ultima resposta 5 de jul. de 2012
Respostas 6
Participantes 3