Duvida com select[RESOLVIDO]

7 respostas
G

Boa noite,
Galera estou com uma duvida muito simples mas ao mesmo tempo mto complexa e gostaria da ajuda de vocês.

Tenho uma tabela chamada cliente que contem idCliente e NomeCliente
e uma tabela chamada Telefone que contem o idCliente como FK e numeroTelefone,pois um cliente pode ter mais que um telefone.
A minha duvida é o seguinte preciso fazer um select no banco que me retorne apenas 1 telefone do cliente, tentei usar distinct porém não deu certo, não sei se implementei errado ou não da certo mesmo.

7 Respostas

Guevara

Vc poderia fazer assim:

@SuppressWarnings("unchecked")
	public List<Telefone> lista(Long idCliente) { 		
		return session.createCriteria(Telefone.class, "t")
		.setProjection(Projections.projectionList()
				.add( Projections.property("t.telefone").as("telefone") )
				).setResultTransformer(new AliasToBeanResultTransformer(Telefone.class))
				.add(Restrictions.idEq(idCliente)).list();
    }

Vai listar os telefones, mas não dá pra setar o que vc quer sem vc passar algum parâmetro.
Tenta assim tb:

public Telefone getTelefone(Long idCliente) { 		
		return (Telefone) session.createCriteria(Telefone.class, "t")
		.setProjection(Projections.projectionList()
				.add( Projections.property("t.telefone").as("telefone") )
				).setResultTransformer(new AliasToBeanResultTransformer(Telefone.class))
				.add(Restrictions.idEq(idCliente)).uniqueResult();

Não sei se desta forma vai servir, tenta ai.
Abraço!

G

Guevara:

preciso fazer um select no banco que me retorne apenas 1 telefone do cliente

Vc poderia fazer assim:

@SuppressWarnings("unchecked")
	public List<Telefone> lista(Long idCliente) { 		
		return session.createCriteria(Telefone.class, "t")
		.setProjection(Projections.projectionList()
				.add( Projections.property("t.telefone").as("telefone") )
				).setResultTransformer(new AliasToBeanResultTransformer(Telefone.class))
				.add(Restrictions.idEq(idCliente)).list();
    }

Vai listar os telefones, mas não dá pra setar o que vc quer sem vc passar algum parâmetro.
Tenta assim tb:

public Telefone getTelefone(Long idCliente) { 		
		return (Telefone) session.createCriteria(Telefone.class, "t")
		.setProjection(Projections.projectionList()
				.add( Projections.property("t.telefone").as("telefone") )
				).setResultTransformer(new AliasToBeanResultTransformer(Telefone.class))
				.add(Restrictions.idEq(idCliente)).uniqueResult();

Não sei se desta forma vai servir, tenta ai.
Abraço!

Po mto obrigado pela atenção mas eu precisaria de fazer em sql mesmo, sem ser pelo hibernate, por isso da minha duvida tipo fazendo

select distinct (c.codigo),c.nome,t.telefone
from cliente c left join telefone t on (c.codigo = t.codigoCliente)

Guevara

Então, vc pode até listar vários telefones, mas pegar um especificamente precisaria passar algum parâmetro para a aplicação saber qual buscar, se vc têm uns 5 telefones cadastrados, qual seria o telefone correto?
Dependendo de como vc criou o banco, até dê pra fazer isso, poste a tabela de Telefones, de repente alguém têm alguma idéia melhor pra fazer isso.

G

Guevara:
Então, vc pode até listar vários telefones, mas pegar um especificamente precisaria passar algum parâmetro para a aplicação saber qual buscar, se vc têm uns 5 telefones cadastrados, qual seria o telefone correto?
Dependendo de como vc criou o banco, até dê pra fazer isso, poste a tabela de Telefones, de repente alguém têm alguma idéia melhor pra fazer isso.

é uma tabela telefone com a chave estrangeira de codigo do cliente e numero
onde um cliente pode ter mais de 1 telefone, so que quando eu faço o select quero buscar apenas 1 telefone

walacy

Algum parametro define qual o telefone que você quer?

Tipo do telefone, ultimo cadastrado, etc…

select c.*, t.* from cliente c 
inner join telefone t on (t.idcliente = c.idcliente and /*Segunda condicao aqui...*/)
G
walacy:
Algum parametro define qual o telefone que você quer?

Tipo do telefone, ultimo cadastrado, etc.......

select c.*, t.* from cliente c 
inner join telefone t on (t.idcliente = c.idcliente and /*Segunda condicao aqui...*/)

hmm nao acho que vou colocar um campo de tipo telefone é melhor ai busca sempre o residencial.

walacy

Apenas trocando por Outer (retorna o cliente, mesmo se não houver telefone).

select c.*, t.* from cliente c   
left outer join telefone t on (t.idcliente = c.idcliente and /*Segunda condicao aqui...*/)
Criado 12 de maio de 2010
Ultima resposta 13 de mai. de 2010
Respostas 7
Participantes 3