Mapeamento de campo calculado no hibernate

Pessoal, eu tenho a seguinte classe a minha aplicação:

@Entity
@Table(name = "CLASSIF")
public class Classificacao{
// todos os campos devidamente papeados e funcionando
// id, propriedades....
private Classificacao pai;

public getPai();

// esse método não possui propriedade/field/campo
// como podem ver, ele é calculado
public int getNivel()
if(pai != null) return pai.getNivel() + 1;
else return 0;
}

Essa classe representa uma hierarquia de classificações de serviços para o sistema que estou construindo.
Por exemplo:

  • Serviços Gerais
    ---- Limpeza de Salas de Aula
    ---- Limpeza de Escritórios
  • Manutenção
    ---- Manutenção Elétrica
    -------- Manutenção Predial
    -------- Manutenção Residencial
    -------- Manutenção Industrial
    ---- Conserto Agendado
    e assim por diante.

Na aplicação, eu gero um árvore, como a arvore de diretório que o windows gera…

eu gostaria de saber se há como eu executar o seguinte hql pelo hibernate:

select
 c
from
 Classificao c
where
 c.nivel = 0

Este sql ia ser util para mim quando eu fosse usar algo do tipo

c.nivel <= 3

,por exempolo. Mais especificamente, gostaria de saber se posso usar o campo “nivel” dentro de uma query.

No entanto, quando eu executo este hql, o hibernate lança uma exceção informando que não consegue resolver a propriedade “nivel” da classe Classificação.
Sabem se posso fazer isso de alguma maneira ??

Gostaria de resolver para que este método fique mais elegante e bem mais legível na leitura do código.

Na boa? Vc não pode persistir isso campo não?

Vai ser muito mais simples se ele estiver persistido.

Por HQL você não conseguiria. Você conseguiria talvez por nativeQuery, caso você crie uma function e chame essa function para fazer o cálculo para vc.

Isso aí vc ta querendo fazer uma conta que envolve herança dentro de um DB que desconhece oq é herança.

Anote seu método com:

O problema deu-se, pois o JPA tenta encontrar esta propriedade no banco e persistí-la, o que, acredito seja apenas um dado lógico e não existente no BD.

Não funfa.
A exceção lançada:

@Transient public int getNivel() { if (isPossuiPai()) { return getPai().getNivel() + 1; } else { return 0; } }

Então, se o campo não existe no banco vc não conseguirá colocar uma condicional com este campo no select.

Você fez: