Problema com banco de dados (Atributos multivalorados)

Se liga nesse select dentro do método findContatos():

Você está buscando dados somente na tabela contatos… os telefones estão em outra tabela, certo ? Seria isso:

Só que agora a porca torce o rabo… essa consulta vai retornar uma linha pra cada telefone que o cara tiver. Como você vai saber que o primeiro é celular e o outro é residencial ou vice-versa ?

não tem problema não, eu só usei o celualar como uma variavél, eu mudei aki, e coloquei telefone 1 e telefoene 2…hehe
eu não sabia fazer consulta com java, aprendí na facul os comandos só no banco de dados msm… vou testar aki, e te falo… valeu amigão

mesmo assim não deu certo… não tah imprimindo na tela os telefones… :frowning:

ah, mas peraí… te contei o começo da estória… Seu primeiro problema é que não estava buscando os telefones. Agora que está, tem que atribuí-los no seu objeto contato.

Logo depois desse select você tem isso:

while (rs.next()){ Contato contato = new Contato(); contato.setId(rs.getLong("id")); contato.setNome(rs.getString("nome")); contato.setEmail(rs.getString("email")); contato.setData_nascimento(rs.getDate("data_nascimento"));

se você acrescentar:

esse é o caminho… veja bem: estou “supondo” um método setTelefone() na tua classe Contato. Altera aí para o que for exatamente…

é isso msm amigo mas ae dá o erro, Column “telefone” not found… desculpa ficar te pertubando, valeu msm

Sem problemas…

Agora veja… se analisar o código que já escreveu vai encontrar as coisas aí… Veja esse exemplo: quando você escreve

quer dizer que: já conectou com o banco, já executou uma consulta e está percorrendo o resultado dessa consulta. Que está dentro de teu objeto rs que é um ResultSet. o rs.getString(“nome”) está dizendo: “ei, rs (que eu sei que você é um ResultSet)… me dê aí o valor do campo nome que está na consulta que foi executada… e quero isso pra hoje !!” O rs vai te retornar o valor se ele achar um campo chamado “nome” na consulta.

Veja em sua consulta qual é o nome do campo que corresponde ao telefone.

Não se deixe atropelar por uma avalanche de conhecimento. Você está no caminho certo, mas precisa compreender o que está fazendo. E continue postando as dúvidas aí, ajuda não vai te faltar com certeza!!

vou testar aki amigo, mas eu tava achando q o erro era na consulta com o banco de dados, estou entendendo sim, vou continuar tentando aki e te falo, vc foi de grande ajuda…

mas aparece o erro nessa função…

[code]
public Contato finfByName(String nome) throws SQLException{

    String select = " SELECT * FROM CONTATOS WHERE nome = ?";  
    Contato contato = null;  
    PreparedStatement stmt = getConnection().prepareStatement(select);  
    stmt.setString(1, nome);  
    ResultSet rs = stmt.executeQuery();  
      
    while (rs.next()){  
        contato = new Contato();  
        contato.setId(rs.getLong("id"));  
        contato.setNome(rs.getString("nome"));  
        contato.setEmail(rs.getString("email"));  
        contato.setData_nascimento(rs.getDate("data_nascimento"));  
        contato.gsetTelefone(rs.getString("telefone"));  
          
    }  
      
    rs.close();  
    stmt.close();  
    return contato;  
          
      
}  

[code]

} [/code]

não tenho certeza, mas acho q tah dando erro, pq a consulta só pesquisa na tabela contatos e não na tabela telefone, eu pensei em fazzer um inner join, mas não sei como… abrigado

Certo bacana. Se você está fazendo isso:

só vai dar certo se na tua tabela CONTATOS lá no banco existir o campo telefone. OU OU OU… se você fizer como mencionei na outra resposta, trocar sua consulta (a instrução SQL) por isso:

"SELECT c.id, c.nome, c.email, c.data_nascimento, t.telefone FROM CONTATOS c, TELEFONES t where t.id = c.id";

Esse formato em que está o select corresponde ao inner join que você pensa ser o que precisa (e é exatamente isso !!!)

ou então… como você mencionou que criou as variáveis telefone 1 e telefone 2… será que você quis dizer que criou os campos telefone 1 e telefone 2 na tabela contatos ? Se for isso, são esses campos que você tem que chamar com o rs.getString("…"). Mas chame os campos pelo nome exato que deu a eles na tabela, e não acho que tenha criado eles com espaço nos nomes

Cara, desculpe… eu sou muito ruim pra explicar

package Dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import Agenda.Contato;
import Agenda.GenericDao;


public class ContatoDao extends GenericDao {
	
	public void salvar(Contato contato) throws SQLException{
		
		String insertContato = " INSERT INTO CONTATOS ( nome, email, data_nascimento) VALUES (?,?,?)";
		String insertTelefones = "INSERT INTO TELEFONE (id, telefone) VALUES (?,?)";
		int id = save(insertContato, contato.getNome(), contato.getEmail(), contato.getData_nascimento());
		
		if (id > -1){
			save(insertTelefones, id, contato.getTelefone());
			save(insertTelefones, id, contato.getCelular());
		}
		
	}
	
	public void alterar (Contato contato) throws SQLException{
		String update = "UPDATE CONTATOS"+
	"SET nome = ?, email = ? , data_nascimento = ?"+
				"WHERE id = ?";
		
		update(update, contato.getId(), contato.getNome(), contato.getEmail(), contato.getData_nascimento());
	}
	
	public void excluir (long id) throws SQLException{
		String delete = "DELETE FROM CONTATOS WHERE id = ?";
		delete(delete, id);
	}
	
	public List<Contato> findContatos() throws SQLException{
		
		List<Contato> contatos = new ArrayList<Contato>();
		
		String select = "SELECT c.id, c.nome, c.email, c.data_nascimento, t.telefone FROM CONTATOS c, TELEFONE t WHERE t.id = c.id";
		
		PreparedStatement stmt = getConnection().prepareStatement(select);
		ResultSet rs = stmt.executeQuery();
		
		while (rs.next()){
			Contato contato = new Contato();
			contato.setId(rs.getLong("id"));
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setData_nascimento(rs.getDate("data_nascimento"));
			contato.setTelefone(rs.getString("telefone"));
				
			contatos.add(contato);
		}
		
		rs.close();
		stmt.close();
		
		return contatos;
	}
	
public Contato finfByName(String nome) throws SQLException{
		
		
		String select = "SELECT *FROM CONTATOS WHERE nome = ?";
		
		Contato contato = null;
		PreparedStatement stmt = getConnection().prepareStatement(select);
		stmt.setString(1, nome);
		ResultSet rs = stmt.executeQuery();
		
		while (rs.next()){
			
			contato = new Contato();
			
			contato.setId(rs.getLong("id"));
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setData_nascimento(rs.getDate("data_nascimento"));
			//contato.setTelefone(rs.getString("telefone"));	
					
		}
		
		rs.close();
		stmt.close();
		return contato;
			
		
	}


}

tah assim agora amigo, eu modifiquei as tabelas não, na tabela telefone tenho id, telefone, e na tabela contato, tenho id, nome, email e data de nascimento eu só mudei o nome na JLabel… obrigado

tah dano erro ao buscar por nome… valeu

Sim, porque você só alterou um dos métodos de pesquisa que é o que lista todos. Se lá na busca por nome você repetir o mesmo miolo vai ver que funciona

deu o erro Parameter index of range (1> number of parameters, which is 0).
tô quase desistindo, mts erros conserta um e aprece outro… :frowning:

Isso é porque está tentando aprender muita coisa de uma vez só… Não sei qual a pegada na tua faculdade, mas como muita gente por aqui, recomendo as apostilas da Caelum (gratuitas e muito bem montadas).

Voltando ao seu erro… no método de pesquisa por nome… por acaso, escreveste isto:

Essa é a string de consulta correta para esse método. Veja que é diferente da anterior por causa do “and c.nome = ?”. É essa cláusula que fará listar um contato ao invés de todos, como no método anterior.

isso msm amigão, resolvido o problema, vc me ajudou demais, valeu msm… abraços