Olá pessoal, estou com problemas em uma consulta onde o usuario informa uma string qualquer e a consulta deve verificar a presença dessa string dentro de uma propriedade de um enum.
um trecho da minha classe enum:
EMAIL_USUARIO(1,"EMAIL_USUARIO", "Email do usuário"),
EMAIL_SENHA(2,"EMAIL_SENHA", "Senha do email do usuário"),
EMAIL_SMTP(3,"EMAIL_SMTP", "Endereço SMTP de email"),
...;
minha consulta:
//criteria criada para a minha classe persistente
Criteria criteria = ((Session)entityManager.getDelegate()).createCriteria(ParametroSistema.class);
//consulta por um enum passado como parametro, neste caso funciona perfeito
if(this.parametroGrupo != null){
criteria.add(Restrictions.eq("parametroGrupo", this.parametroGrupo));
}
//pesquisa em uma outra propriedade da classe, que tb é um enum, mas por um trecho da descrição desse enum
if(this.nomeParametro != null && !this.nomeParametro.isEmpty()){
criteria.add(Restrictions.ilike("parametroNome.descricao", this.nomeParametro));
}
this.listParametros = criteria.list();
Na consulta acima caso o usuário informe email deveria retornar as enumerações exibidas como exemplo no inicio do post, mas é disparado o seguinte erro após o criteria.list():
Qualquer ajuda é bem vinda!
[]'s
Thiago…
normalmente o é o código do ENUM que é salvo no banco de dados, a menos que você especifique o contrário, que no caso é salvar outra propriedade do ENUM.
Você tem que ver o que ta salvando no banco de dados, se é o código do ENUM ou a string de descrição, ou algo do tipo.
Olá Mathias, obrigado pela respota, o enum é composto por um identificador (inteiro) , nome(uma constante), e descricao(uma string). Neste caso o que é guardado no bd é o identificador ou seja um inteiro, pelo que percebi mesmo criando ou não alias para a propriedade ele tenta fazer um join e não consegue.
O que eu queria é algo como pegar um getDescricao e usar o ilike nele… Vou continuar pesquisando!
Grato!
[]'s
Thiago, tem como você substituir o comportamento padrão de salvar o ordinal do enum no banco, basta adicionar
@Enumerated(EnumType.STRING)
no mapeamento da propriedade do tipo enum que será persistida. Nesse caso ele passará a salvar a representação String do enum.
Legal essa possibilidade, mas o problema é que trabalho com base legada e não posso fazer alterações no esquema do bd.
Sera que não existe uma outra possibilidade sem alterar o esquema do bd?
Mas como o enum ñ possui muitas posições resolvi temporariamente de uma maneira ñ muito elegante (contains em cada posição da lista devolvida apos aplicar os outros filtros).
[]'s
Outra possibilidade é criar uma lista com os enums que se encaixam nesse filtro, e na busca no bd você usa
Restrictions.in(propertyName, values);
isso faz com que o bd procure pelos códigos da lista de enums que você pré-filtrou.