Ejbql

3 respostas
F

Ola Amigos, estou com seguinte problema, tentando utlizar uma query que aparentemente é simples.
Pois tenho uma query onde horas ela pode passar codigo, nome e cep, ou buscar so por nome etc…

por esse motivo faço uma validacao ex.
:param = 0 or obj.codigo =:param
ja usei para string
:param is null or obj.nome =:param, porem nao funciona para o postgre nem para firebird.

agora abaixo vou detalhar o erro:

A Query

StringBuffer sql = new StringBuffer();

sql.append(" select cliente from Cliente cliente");

sql.append(" inner join cliente.listaEndereco endereco");

sql.append(" where :codigo = 0 or  cliente.id =:codigo “);

sql.append( and  (:nome =’’ or  cliente.nome like :nome)");

//		sql.append(" and  (:cep is null  or  endereco.cep =:cep) “);

Query query = em.createQuery(sql.toString());

if(dto.getCliente() != null && dto.getCliente().getId() != null){

query.setParameter(“codigo”,dto.getCliente().getId().intValue());

}else{

query.setParameter(“codigo”,new Integer(0));

}

if(dto.getCliente() != null && dto.getCliente().getNome() != null

&& !".equals(dto.getCliente().getNome())){

query.setParameter(nome”,"%" + dto.getCliente().getNome().toString() + %);

}else{

query.setParameter(nome”,new String(""));

}

FireBird
select
cliente0_.id_cliente as id1_0_,
cliente0_.nome as nome0_,
cliente0_.id_tipo_cliente as id3_0_
from
CLIENTE cliente0_
inner join
CLIENTE_ENDERECO listaender1_
on cliente0_.id_cliente=listaender1_.id_cliente
where
?=0
or cliente0_.id_cliente=?
and (
?=’’
or cliente0_.nome like ?
)

ERRO
could not bind value ‘%t%’ to parameter: 3; Data truncation

Postgre
Não da erro porem ele traz o registro que contem na tabela e o mesmo nao possui ?%t%?

Alguem imagina o que pode ser?

Uso Jboss seam + EJB3

Att

3 Respostas

F
Ah galera so pra complementar

StringBuffer sql = new StringBuffer();

sql.append(" select cliente from Cliente cliente");

sql.append(" inner join cliente.listaEndereco endereco");

sql.append(" where 1=1 “);

if(dto.getCliente() != null && dto.getCliente().getId() != null){

sql.append( and cliente.id =:codigo");

}
if(dto.getCliente() != null && dto.getCliente().getNome() != null 
			&& !"".equals(dto.getCliente().getNome())){
		sql.append(" and cliente.nome like :nome");
	}
se eu fizer dessa maneira, funciona.

porem queria uma coisa mais inteligente, pois ja usei com oracle na empresa dessa maneira abaixo:

sql.append(" where :codigo=0 or  cliente.id =:codigo");

sql.append(" and  :nome is null or  cliente.nome =:nome");

porem com o postgre e firebird nao esta dando certo !!!

F
<?xml version="1.0" encoding="UTF-8"?> org.hibernate.ejb.HibernatePersistence java:/treinamentoDatasource
F

Pessoal descobri era so colocar o
sql.append(" where (:codigo=0 or cliente.id =:codigo)");
agora erro do firebird, deve ser outro tratamento.

grato

Criado 22 de setembro de 2008
Ultima resposta 22 de set. de 2008
Respostas 3
Participantes 1