Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Fazendo cast de um campo text na minha jpql

Bom dia pessoal.

Criei uma entidade com um atributo do tipo @Lob como mostrado abaixo.

@Lob
private String parecerComissao;

Esse campo é uma descrição de um texto que limitei até 500 caracteres para o usuário digitar na minha view. Eu preciso mostrar essas informações no meu relatório. Criei um jpql que contém um cast desse campo para string como abaixo.

select.......
cast(c.resultado.parecerComissao as string)
from....

O problema é que esse cast limita o texto em 255 caracteres. Como eu faço um cast em jpql para que eu consiga receber o texto completo desse atributo na minha consulta?

obrigado

9 respostas

` Tente anotar da seguinte forma:

@Lob
@Column(name = "CHARS", columnDefinition = "CLOB", length=500)

`

Vinícius, obrigado pela ajuda.

Tentei aqui mas não deu certo.

Bom, quando eu salvo o registro na view, o campo é gravado normalmente, mesmo que o texto tenha mais de 255 caracteres. O problema é na hora de recuperar esse texto e mostrar no relatório, já que o cast na jpql converte para string e trunca em 255 caracteres.

Eu queria saber se posso substituir o "string" para algum outro tipo dentro do cast na jpql.

cast(c.resultado.parecerComissao as string)

obrigado

Olá Marco, Se você simplesmente não usar o cast, assim:

select.......
c.resultado.parecerComissao
from....

Dá algum erro? Se sim, qual por favor?

Renato, o erro é o mesmo quando rodo uma query que tem um campo text no sqlserver. Ele informa que os tipos de dados de texto, ntext e imagem não podem ser comparados ou classificados, por isso precisa de um cast para varchar.

Exceção lançada: HTTP Status 500 - Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet.

com.microsoft.sqlserver.jdbc.SQLServerException: The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Se eu usasse uma query nativa eu poderia fazer um convert(varchar(500, res.parecerComissao) que daria certo. Mas quero mesmo é usar jpql.

obrigado.

Marco Aurelio tente colocar então o seguinte mapeamente e fazer o select sem o cast:

@Column(name = "Nome_Do_Campo_Na_Tabela", columnDefinition = "VARCHAR(500)")

Olá Vinícius.

Tentei aqui mas gerou a mesma exceção!

obrigado.

solução!

Obrigado pessoal.

Tive que alterar o tipo do campo no sqlserver mesmo, não teve jeito. Passei de text para varchar(500) e deu certo.

valeu pela ajuda!!

Só colocando uma observação, ok Marco?

Mas geralmente essa não é uma solução aplicada no dia-a-dia. Não podemos alterar o tipo de campo no banco simplesmente por limitação técnica na aplicação, principalmente por conta de framework. Há casos inclusive que sequer esse tipo de acesso ao banco temos.

Imaginando que fosse uma situação no seu trabalho, no pior dos cenários, nessa consulta em específico você poderia usar SQL puro para trazer os dados.

Mas creio que seja possível fazer o cast desejado, mas realmente não consegui lhe ajudar, pois não encontrei muita coisa na Internet e sem o ambiente aqui para fazer testes antes de ficar postando possíveis soluções fica mais difícil mesmo.

Abraços!

Renato bom dia.

Você está corretíssimo!!! Realmente essa foi a pior saída para solucionar o problema. Apenas fiz essa alteração para emitir um relatório com certa urgência, mas já voltei o campo para text e estou quebrando a cabeça aqui.

Muito obrigado pelo feedback meu amigo.

abraço.