Case em HQL [Resolvido]

E ai galera, to precisando da ajuda de vcs!!

Seguinte, tenho uma tabela chamada controle de peças, dentro dela tem um ID da tabela tipo de controle e um campo STRING chamado valor.

como funciona: esse campo valor (String), poderá receber tanto um DATE quanto um DOUBLE, ai que mora o problema, pois preciso fazer uma comparação desses campos em HQL.

Montei uma estrutra em SQL e funcionou:



SELECT 
  *,
CASE tipocontrole.cod_tipocontrole

WHEN 1 then 

cast(valor as date) > '2011-01-01'

ELSE 

cast(valor as float) < 10.5

END

FROM 
  public.controlepecas, 
  public.pecasveiculo, 
  public.tipocontrole
WHERE 
  controlepecas.codigo_pecasveiculo = pecasveiculo.codigo_pecasveiculo AND
  controlepecas.codigo_tipocontrole = tipocontrole.cod_tipocontrole

  situacao  = true

porem ao criar em HQL me da erro:

 StringBuilder sql = new StringBuilder("select object(o), ");

        sql.append("CASE o.tipoControle.cod_tipoControle WHEN 1 ");
        sql.append("CAST(valor as date) > '2011-01-01' ");
        sql.append("ELSE ");
        sql.append("CAST(valor as float) < 10.5 ");
        sql.append("END ");
        sql.append("FROM ControlePecas as o ");

erro:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: , near line 1, column 17 [select object(o), CASE o.tipoControle.cod_tipoControle WHEN 1 CAST(valor as date) > '2011-01-01' ELSE CAST(valor as float) < 10.5 END FROM modelo.frota.ControlePecas as o ] at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:31) at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:24) at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)

Alguem sabe como resolver, ou tem alguma outra ideia para me ajudar??

[]'s

Monta duas HQLs, um para Date e outra para String e faz a seleção das HQLs no java mesmo. Acho que até fica mais rápida a execução das HQLs.

Acho a idéia do duducordeiro_ interessante.
Mas, já notou que o hibernate reclama da vírgula que está em

select object(o), //aqui

Já tentou tirá-la para ver se não roda?

[quote=drsmachado]Acho a idéia do duducordeiro_ interessante.
Mas, já notou que o hibernate reclama da vírgula que está em

select object(o), //aqui

Já tentou tirá-la para ver se não roda?[/quote]

Sim, ai ele reclama do CASE…

vo tentar a ideia do duducordeiro!

[]'s

montei 2 sql e deu certo:

[code]StringBuilder sql = new StringBuilder("select object(o) FROM ControlePecas as o ");

    sql.append("WHERE o.tipoControle.cod_tipoControle = 1");
    sql.append(" AND CAST(valor as date) > '2011-01-01'");[/code]

[code]sql = new StringBuilder("select object(o) FROM ControlePecas as o ");

        sql.append("WHERE o.tipoControle.cod_tipoControle <> 1");
        sql.append(" AND CAST(valor as float) > 10.5");[/code]

Muito Obrigado

\o/

Se der tenta usar as HQLs direto mapeadas nas classes. Desta forma elas ficam bem mais rápidas quando se usa com grandes buscas, pois o Hibernate não precisa fazer a validação delas em tempo de execução.