Consulta JPQL List<Enum>

15 respostas
A

E ai pessoal, Tudo Blz…

Estou com problemas para tentar fazer a pesquisa setando o valor de uma enum como parametro.
Segue os dados…

Enum:
package modelo;

public enum TipoRelacionamento {

CLIENTE("Cliente"), 
FORNECEDOR("Fornecedor"),
COLABORADOR("Colaborador"),
ESTABELECIMENTO("Estabelecimento");


private String descricao;

TipoRelacionamento(String descricao){
	this.descricao = descricao;
}

public String getDescricao() {
	return descricao;
}

}

Na minha entidade essa enum esta mapeada da seguinte forma:

@ElementCollection(fetch = FetchType.LAZY, targetClass = EnumTipoRelacionamento.class)
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private List<EnumTipoRelacionamento> tipoRelacionamento;

Consigo salvar o cadastro no banco… Agora quero fazer um select onde o tipo do relacionamento tiver "COLABORADOR"
Estou tentando fazer assim:

@Transactional
public List<ParceiroNegocio> listagemUsuario(String nome) {
	return this.manager.createQuery("from parceiro_negocio pn join pn.tipoRelacionamento r where r in (:tipoRelacionamento)", ParceiroNegocio.class)
			//.setParameter("nome", nome.toUpperCase() + "%")
			.setParameter("tipoRelacionamento", TipoRelacionamento.COLABORADOR.name())
			.getResultList();
}

15 Respostas

darlan_machado

E qual o problema? Algum erro? Não retorna o esperado?
Qual a query que o JPA gera?

A

o Erro apresentado é:

darlan_machado

Você está chamando o método name() do enum, remova esta chamada, afinal, você precisa passar o enum específico para comparação.

A

eu tentei comparar sem o name, tentei colocar toString… tentei sem nenhum parametro após colaborador… mas nada funcionou…

qual seria a maneira correta de efetuar essa pesquisa informando como parametro um ou vários valores da enum?

darlan_machado

Não funcionou como, fera?
Algum erro? A consulta não traz o que deveria?

Veja, se você tem um campo que é um enum, deve comparar com o enum

SELECT x FROM Blablabla x WHERE x.atributoEnum = :valor

query.setParameter("valor", AtributoEnum.QUALQUER_VALOR);

Deveria funcionar, conforme segue

A

fiz alteração conforme seu exemplo:

mas não deu certo…
Segue o erro:

darlan_machado

Cara, desculpe, mas a questão é extremamente óbvia, né?
Se você tem um IN, espera-se que o argumento seja uma lista, não?

List<TipoRelacionamento> lista = new ArrayList<>();
 lista.add(TipoRelacionamento.COLABORADOR);
setParameter("tipoRelacionamento", lista)
A

darlan, desde já peço desculpas pela minha falta de conhecimento… e quero agradecer de ante mão sua atenção…

Conforme mostra a imagem, eu alterei o codigo da consulta, onde não estou utilizando o “in” estou utilizando “=” conforme o exemplo que você me mostrou…

mesmo com essa alteração do codigo o erro continua o mesmo…

A

Galera se alguém puder me ajudar, até o momento não consegui solucionar…

darlan_machado

Cara, o erro não faz referência à última query que você postou.
Veja, ele reclama de um parâmetro chamado colaborador, inexistente na tua última query.

A

darlan_machado vou postar as alterações que fiz e a messagem que está dando agora…

Criei o List do tipo relacionamento conforme você explicou e ficou assim:

@Transactional
public List<ParceiroNegocio> listagemUsuario(String nome) {
	List<TipoRelacionamento> lista = new ArrayList<>();
	lista.add(TipoRelacionamento.COLABORADOR);
	
	return this.manager.createQuery("from parceiro_negocio where upper(nome) like :nome and tipoRelacionamento in (:tipo)", ParceiroNegocio.class)
			.setParameter("nome", nome.toUpperCase() + "%")
			//.setParameter("tipo", TipoRelacionamento.COLABORADOR)
			.setParameter("tipo", lista)
			.getResultList();
}

Ele gerou o seguinte erro:

Hibernate: 
select
    parceirone0_.id as id1_6_,
    parceirone0_.bairro_id as bairro25_6_,
    parceirone0_.cep as cep2_6_,
    parceirone0_.cnpj as cnpj3_6_,
    parceirone0_.cpf as cpf4_6_,
    parceirone0_.dataExpedicao as dataExpe5_6_,
    parceirone0_.dataNascimento as dataNasc6_6_,
    parceirone0_.email as email7_6_,
    parceirone0_.estadoCivil as estadoCi8_6_,
    parceirone0_.inscricaoEstadual as inscrica9_6_,
    parceirone0_.inscricaoMunicipal as inscric10_6_,
    parceirone0_.nome as nome11_6_,
    parceirone0_.nomeFantasia as nomeFan12_6_,
    parceirone0_.nomeMae as nomeMae13_6_,
    parceirone0_.nomePai as nomePai14_6_,
    parceirone0_.numero as numero15_6_,
    parceirone0_.orgaoEmissor as orgaoEm16_6_,
    parceirone0_.rg as rg17_6_,
    parceirone0_.rua as rua18_6_,
    parceirone0_.status as status19_6_,
    parceirone0_.suframa as suframa20_6_,
    parceirone0_.telefone1 as telefon21_6_,
    parceirone0_.telefone2 as telefon22_6_,
    parceirone0_.telefone3 as telefon23_6_,
    parceirone0_.tipoPessoa as tipoPes24_6_ 
from
    parceiro_negocio parceirone0_ cross 
join
    ParceiroNegocio_tipoRelacionamento tiporelaci1_ 
where
    parceirone0_.id=tiporelaci1_.ParceiroNegocio_id 
    and (
        upper(parceirone0_.nome) like ?
    ) 
    and (
        {non-qualified-property-ref} in (
            ?
        )
    )
2018-06-18 12:55:23,198 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] SQL Error: 0, SQLState: 07001
2018-06-18 12:55:23,199 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] No value specified for parameter 2
A

Darlan, você conseguiu entender o erro que postei agora por ultimo?

darlan_machado

Entender a mensagem de erro, sim, mas, pela forma que você colocou, não.

A

poderia me ajudar a elaborar esse código? ja quebrei a cabeça e nao to conseguindo achar a forma correta…

quero criar essa consulta com dois parâmetros, o primeiro é pelo nome… esse já está funcionando da seguinte forma…

public List<ParceiroNegocio> listagemUsuario(String nome) {
return this.manager.createQuery("from parceiro_negocio where upper(nome) like :nome", ParceiroNegocio.class)
			.setParameter("nome", nome.toUpperCase() + "%")
			.getResultList();
}

o problema está ao tentar implementar o segundo parâmetro onde quero que ele pesquise o nome somente dos ParceirosNegocio que tiver marcado como “COLABORADOR”

O campo “TipoRelacionamento” dentro da tabela ParceiroNegocio é uma lista de enum:

@ElementCollection(fetch = FetchType.LAZY, targetClass = EnumTipoRelacionamento.class)
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private List<EnumTipoRelacionamento> tipoRelacionamento;

No meu banco de dados ele criou uma nova tabela:

poderia me ajudar a elabora essa consulta…?

darlan_machado

Olha, faz séculos que não mexo com JPA/Hibernate, tampouco com HQL.
Eu dei uma olhada e encontrei esta thread, onde existe um problema bem parecido com o teu (uma banda com uma lista de gêneros, onde cada gênero é um enum).
Creio que isso pode resolver.

Criado 15 de junho de 2018
Ultima resposta 18 de jun. de 2018
Respostas 15
Participantes 2