Problemas com @NamedQuery

8 respostas
EuclidesFilizola

Bom dia pessoal,

estou com um problema sério, não sei porque.

Estou tentando fazer uma busca no meu banco de dados, que se resume assim:

select * from … x.x.x.x.x. where abastecimento.status = 1.

ou seja

eu tenho no meu banco de dados um atributo booleano chamado status. ou seja, se ele for true, ele recebe 1, se for false, recebe 0.

bem, eu criei a seguinte namedquery

@NamedQuery(name="gerarRelatorio",query="select a from Abastecimento a where a.status = 1 and a.numFicha = ? or a.veiculos.id = ? " +
		"or a.veiculos.placa = ? or a.dataAbastecimento between ? and ? order by a.dataAbastecimento")
})

E eu não sei por qual problema, ele está trazendo todos os registros, tanto os de status 0, como os de status 1.

estou utilizando banco de dados MySQl, e jsf.

Abraços.

8 Respostas

dieguittom

Trabalho com Seam e a passagem de parâmetros na namedquery é um pouco diferente.
Mas já tentou passar true no parâmetro em vez de 1?

EuclidesFilizola

Bom,

a passagem de parametros, eu posso fazer da seguinte forma:

@SuppressWarnings("unchecked")
	@Transactional(readOnly = true)
	public List<Abastecimento> gerarRelatorio(Integer numFicha,Integer idVeiculo, String placaVeiculo, Date dataIni, Date dataFim){
		
		Query query = entityManager.createNamedQuery("gerarRelatorio");

		query.setParameter(1, numFicha);
		query.setParameter(2, idVeiculo);
		query.setParameter(3, placaVeiculo);
		query.setParameter(4, dataIni);
		query.setParameter(5, dataFim);
		

		List<Abastecimento> result = (List<Abastecimento>) query.getResultList();

		return result;
		
	}

e eu já tentei colocar o true ae,

mas continua o erro.

o hibernate gera um script sql gigantesco que nem adianta eu colocar aqui.

romarcio

Acho que o problema é a condição OR, você deve troca-lá para AND.
Você está testando de o status é igual a 1 e numFicha igual a um parametro qualquer, mas casa isso seja false, o próximo OR vai trazer todos os tipos de status.

EuclidesFilizola

o problema é que eu preciso assim,

que o status seja obrigado a 1,

e o restante, pode ser ou seja,

eu preciso do equipamento do id = 22, e que ele tenha seu status = 1 , entendeu ?

todas as outras entidades tem esse atributo status, entendeu ?

EuclidesFilizola

eu preciso listar a entidade que for selecionada, e que ela tenha status = 1 ( true),

não sei se meu sql tem algo errado, se alguém puder me ajudar … mas é esse o problema… eu preciso listar … quem for setado, ou numero ficha, ou id, ou algo do tipo… e que obrigatoriamente tenha o status = true,

entendeu ?

romarcio

Elimina tudo que pode ser OR e deixa só os testes AND. Se pode ser OR não precisa estar na consulta, por que vai ser OU não igual ao parametro que você passou.

romarcio

Se você fizer assim: select a from Abastecimento a where a.status = 1 and a.numFicha = ? order by a.dataAbastecimento deve trazer o que quer.

deise.vicky

Você testou essa query no DB? Viu se realmente ela traz todos os dados que você precisa?
Se não, é sempre bom testar antes de sair criando as querys.

Tenta fazer primeiro da seguinte forma:

@NamedQuery(name="gerarRelatorio", query="select a from Abastecimento a where a.status = :status order by a.dataAbastecimento")  
})  

Query query = entityManager.createNamedQuery("gerarRelatorio");

query.setParameter("status", true);

Teste essa query e veja se traz apenas os teus registros com Status = “true”.
Se isso der certo você coloca outros parâmetros na sua query.
Sempre faço dessa forma e dá certo. Inclusive já utilizei esse tipo de query para buscar por Status ‘true’ ou ‘false’ e nunca tive problemas…

Criado 31 de maio de 2011
Ultima resposta 1 de jun. de 2011
Respostas 8
Participantes 4