[RESOLVIDO]Problemas pesquisar com Date

Galera,Estou com problema na hora de selecionar do banco a data , ele vem com formato : yyyy-mm-dd , faço a inserção normal dd-mm-yyyy.
teria alguma forma de buscar do banco com formato brasileiro, eu pesquisei alguns posts mas não consegui achar o que eu precisava.

Aqui esta meu select

   public  List<Cliente> getLista (String nome) throws SQLException {
       
  String sql ="select * from cliente INNER JOIN Endereco ON cliente.idEndereco = Endereco.idEndereco WHERE cliente.nome like ? ";
        
           List<Cliente> minhaLista;
           try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
               stmt.setString(1, nome);
            try (ResultSet rs = stmt.executeQuery()) {
                minhaLista = new ArrayList<Cliente>();
                while (rs.next()) {
                    Cliente c1 = new Cliente();
                   
                    c1.setCodcliente(Integer.valueOf(rs.getString("codcliente")));
                    c1.setNome(rs.getString("nome"));
                    c1.setTelefone(rs.getString("telefone"));
                    c1.setCpf(rs.getString("cpf"));
                    c1.setEmail(rs.getString("email"));  

                    c1.setDatanascimento(rs.getDate("datanascimento"));  

                    c1.setObservacao(rs.getString("observacao"));  
                    Endereco e = new Endereco(); 
                    e.setEndereco(rs.getString("endereco"));   
                    e.setCidade(rs.getString("cidade"));   
                    c1.setEndereco(e);
                    minhaLista.add(c1);
                    
                    
               

               }
        rs.close();
        stmt.close();
        return minhaLista;
     
     }
   }
 }

Se alguém pode me ajudar com dicas etc…Agradecerei muito.

Cara possível até é, mas é trabalhoso, pois você teria de ter configurado isso (formato da data) quando se cria a estrutura do banco (base, tabelas, etc) e sinceramente não compensa.

Vi que você traz do banco um objeto do tipo Date (dataNascimento) e seta direto no seu objeto pelo método setDataNascimento correto?

se o que você precisa é somente exibir a data formatada, crie um método a mais na sua classe para retornar um String com a data no formato que deseja e utilizando a classe SimpleDateFormat, ex:

public String getDataNascimento(String formato) {
   return new SimpleDateFormat(formato).format(dataNascimento); // desde que dataNascimento seja java.util.Date
}

Depois para usar basta:

cliente.getDataNascimento("dd/MM/yyyy");

Dessa forma você não precisa mexer em nada no banco nem na conexão com ele, somente na classe Cliente para exibir a data no formato que quiser já que é um parâmetro e você não está preso ao formato nacional.

Espero ter ajudado.

Aqui esta minha classe CLiente.

public class Cliente {
    
  int codcliente;
  String nome;
  String cpf;
  String telefone;
  Date datanascimento;
  String email;
  String observacao;
  Endereco endereco;
  
   public Cliente(){  
            
        datanascimento = new Date();  
    }  
  
    public String getDataFormatada() {  
        SimpleDateFormat formatado = new SimpleDateFormat("dd/MM/yyyy");  
        String dataFormat = formatado.format(datanascimento);  
        return dataFormat;  
    }  

    public Date getDatanascimento() {
        return datanascimento;
    }

    public void setDatanascimento(Date datanascimento) {
        this.datanascimento =  datanascimento;
    }
  
  
}

Com ela na hora de inserir e de boa.inseri no formato nacional.mas no banco ele só puxa o padrão americano
So se na minha classe estiver algo errado,pq ela já esta formatada né?

Obrigado por esta me ajudando.

Como assim formato nacional no banco, aparece a data no formato dd/MM/yyyy na coluna/campo do banco, só se for access não?

Agora o que eu sei é a classe Date possui recursos para entender o formato que você declara, e na hora de inserir na base via PreparedStatement ele converte para o formato universal (e não americano, pois o padrão americano é MM/dd/yyyy).

No banco ele aparece universal igual vc falo.pois ele inseri formato brasileiro ,mas só que quando eu pesquiso ele não vem no formato brasileiro.

Tem uma ideia do que posso fazer ? estou pesquisando em outros fórum tmb mas ate agora nada.

[quote=junio103]No banco ele aparece universal igual vc falo.pois ele inseri formato brasileiro ,mas só que quando eu pesquiso ele não vem no formato brasileiro.

Tem uma ideia do que posso fazer ? estou pesquisando em outros fórum tmb mas ate agora nada.[/quote]

Então como te falei no post anterior, agora que você me confirmou que o banco está da mesma forma, na verdade a classe Date engana você, pois como disse, ela tem recursos para entender uma data dd/MM/yyyy e convertê-la para yyyy-mm-dd pois as classes de conexão do Java sabem na hora da conexão qual formato o banco trabalha daí ele converte pro banco entender, pescou?

E na boa, se você já tem o banco pronto não vale a pena ficar esquentando a cabeça por uma coisa dessas, o trabalho que você terá de fazer na estrutura do banco vai te desanimar.

E outra os SGBD’s já trabalham com datas nesse formato justamente por questões de compatibilidade e performance, não vale a pena mexer com isso não véi.

Sim entendi .

Mas como eu vou fazer para mostrar a data corretamente para o usuário ,dd-mm-yyyy , eu não posso mostrar yyyy-mm-dd,
Certamente deve ter alguma forma.

Preciso de ajuda em como fazer isso.

Dê uma olhada: http://www.guj.com.br/java/302103-resolvidoproblemas-com-date-padrao-americano

[quote=junio103]Sim entendi .

Mas como eu vou fazer para mostrar a data corretamente para o usuário ,dd-mm-yyyy , eu não posso mostrar yyyy-mm-dd,
Certamente deve ter alguma forma.

Preciso de ajuda em como fazer isso.[/quote]

Você não testou seu próprio método não é?

 public String getDataFormatada() {    
        SimpleDateFormat formatado = new SimpleDateFormat("dd/MM/yyyy");    
        String dataFormat = formatado.format(datanascimento);    
        return dataFormat;    
    }

Eu ainda tinha lhe mostrado uma forma menos amarrada quanto ao formato lembra?

public String getDataNascimento(String formato) {  
   return new SimpleDateFormat(formato).format(dataNascimento);
}

Dessa forma você pode passar qualquer formato para exibir a data de nascimento do clientte:

Cliente cliente = new Cliente();
System.out.println("Formato nacional com barras: " + cliente.getDataNascimento("dd/MM/yyyy"));
System.out.println("Formato nacional com hifens: " + cliente.getDataNascimento("dd-MM-yyyy"));
System.out.println("Hora completa: " + cliente.getDataNascimento("HH:mm:ss"));

Você pode ficar na dúvida e perguntar “Mas eu já tenho um método getDataNascimento() que me retorna um Date, como posso ter outro que retorna uma String?”

A resposta: Polimorfismo com sobrecarga de métodos.

Faça alguns testes e veja o resultado.

Eu fiz do seu jeito para tentar mostrar a pesquisa no formato certo , mas não consegui.

Minha pesquisa sai desse formato

1 Flavio (12)3123-1231 123.123.123-12 Flavio@ (2012-12-15) Quadra 1b / não esta saindo formato brasileiro

Aqui esta a classe

public class Cliente {
    
  int codcliente;
  String nome;
  String cpf;
  String telefone;
  Date datanascimento;
  String email;
  String observacao;
  Endereco endereco;
  
   public Cliente(){  
            
        datanascimento = new Date();  
    }  
  
     public String getDataFormatada() {    
        SimpleDateFormat formatado = new SimpleDateFormat("dd/MM/yyyy");    
        String dataFormat = formatado.format(datanascimento);    
        return dataFormat;    
    }    
       public String getDataNascimento(String formatado) {     
        return new SimpleDateFormat(formatado).format(datanascimento);   
      
    }   
        
       
    public Date getDatanascimento() {
        return datanascimento;
           
    }

    public void setDatanascimento(Date datanascimento) {
        this.datanascimento =  datanascimento;
    }

Aqui esta a a Lista que pesquisa os Cliente


public class Cliente {
    
   public  List<Cliente> getLista (String nome) throws SQLException {
       
  String sql ="select * from cliente INNER JOIN Endereco ON cliente.idEndereco = Endereco.idEndereco WHERE cliente.nome like ? ";
        
           List<Cliente> minhaLista;
           try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
               stmt.setString(1, nome);
            try (ResultSet rs = stmt.executeQuery()) {
                minhaLista = new ArrayList<Cliente>();
                while (rs.next()) {
                    Cliente c1 = new Cliente();
                   
                    c1.setCodcliente(Integer.valueOf(rs.getString("codcliente")));
                    c1.setNome(rs.getString("nome"));
                    c1.setTelefone(rs.getString("telefone"));
                    c1.setCpf(rs.getString("cpf"));
                    c1.setEmail(rs.getString("email")); 
                    
                    c1.setDatanascimento(rs.getDate("datanascimento"));  
                    
                    c1.setObservacao(rs.getString("observacao"));  
                    Endereco e = new Endereco(); 
                    e.setEndereco(rs.getString("endereco"));   
                    e.setCidade(rs.getString("cidade"));   
                    c1.setEndereco(e);
                    minhaLista.add(c1);
                      
                    
               

               }
        rs.close();
        stmt.close();
        return minhaLista;
     
     }
   }
 }

Outro jeito que fiz para eu buscar o cliente na data formatada e não funcionou tmb


 public String getDataNascimento(String formatado) {   
         Cliente cliente = new Cliente();
         cliente.getDataNascimento("dd/MM/yyyy");
        return new SimpleDateFormat(formatado).format(datanascimento);   
        
      
    }  

Preciso que alguém me ajude , já estou ficando loco com isso :/.Obg

[quote=junio103]Eu fiz do seu jeito para tentar mostrar a pesquisa no formato certo , mas não consegui.

Minha pesquisa sai desse formato

1 Flavio (12)3123-1231 123.123.123-12 Flavio@ (2012-12-15) Quadra 1b / não esta saindo formato brasileiro

[/quote]

Tá mas como você está exibindo essa lista? Poste apenas esse trecho pra gente ver.

Aqui esta como eu mostro a pesquisa.

 private void mostraPesquisa(){
      while(tmCliente.getRowCount()>0){
         tmCliente.removeRow(0);
      }
      if(contatos.size() == 0){
          JOptionPane.showMessageDialog(null, "Nenhum contato cadastrado");
      }else{
          String[] linha = new String[]{null,null};
                for (int i = 0; i <contatos.size(); i++) {
         tmCliente.addRow(linha);
         tmCliente.setValueAt(contatos.get(i).getCodcliente(), i, 0);
         tmCliente.setValueAt(contatos.get(i).getNome(), i, 1);
         tmCliente.setValueAt(contatos.get(i).getTelefone(), i, 2);
         tmCliente.setValueAt(contatos.get(i).getCpf(), i, 3);
         tmCliente.setValueAt(contatos.get(i).getEmail(), i, 4);
         tmCliente.setValueAt(contatos.get(i).getDatanascimento(), i, 5);
         tmCliente.setValueAt(contatos.get(i).getObservacao(), i, 6);
         tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 7);
         tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 8);
         
                }   
            }
        }   
   }

e aqui como lista

    public void listarContatos() throws SQLException{
           ClienteDAO dao = new ClienteDAO();
          contatos = dao.getLista("%"+jTPesquisa.getText()+"%");
        
         
      }

Obrigado por estar me ajudando. :]

Beleza, agora já tentou trocar essa linha:

tmCliente.setValueAt(contatos.get(i).getDatanascimento(), i, 5);

Por essa:

tmCliente.setValueAt(contatos.get(i).getDatanascimento("dd/MM/yyyy"), i, 5);

O que acontece é o seguinte, quando se chama algo que retorne um Date, por padrão o toString() dele é configurado para mostrar a data completa com hora e tudo mais.

kkk Resolvido vc me fez ir la na classe de pesquisa e mudei o datanascimento pelo q tem formato e deu cert

Para Possíveis Pesquisas.


 private void mostraPesquisa(){
      while(tmCliente.getRowCount()>0){
         tmCliente.removeRow(0);
      }
      if(contatos.size() == 0){
          JOptionPane.showMessageDialog(null, "Nenhum contato cadastrado");
      }else{
          String[] linha = new String[]{null,null};
                for (int i = 0; i <contatos.size(); i++) {
         tmCliente.addRow(linha);
         tmCliente.setValueAt(contatos.get(i).getCodcliente(), i, 0);
         tmCliente.setValueAt(contatos.get(i).getNome(), i, 1);
         tmCliente.setValueAt(contatos.get(i).getTelefone(), i, 2);
         tmCliente.setValueAt(contatos.get(i).getCpf(), i, 3);
         tmCliente.setValueAt(contatos.get(i).getEmail(), i, 4);
         tmCliente.setValueAt(contatos.get(i).getDatanascimento("dd/MM/yyyy"), i, 5);
         tmCliente.setValueAt(contatos.get(i).getObservacao(), i, 6);
         tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 7);
         tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 8);
         
                }   
            }
        }   
   }

Muito obrigado solidsnake , e a quem me ajudou tmb

RESOLVIDO

Beleza brother, agora posso fazer uma sugestão para melhorar um pouco seu código e deixá-lo mais performático?

essa variável tmCliente é uma JTable? se sim poderia fazer o código do mostaPesquisa() dessa forma:

private void mostraPesquisa(){  

     int totalLinhas = tmCliente.getRowCount() - 1;
     tmCliente.removeRowSelectionInterval(0, totalLinhas);

     if(contatos.size() == 0){  
         JOptionPane.showMessageDialog(null, "Nenhum contato cadastrado");  
         return; // em métodos void costuma ser muito usado, tendo um comportamento de um break
     }
     
     String[] linha = new String[]{null,null};

     for (int i = 0; i &lt;contatos.size(); i++) {  
        tmCliente.addRow(linha);  
        tmCliente.setValueAt(contatos.get(i).getCodcliente(), i, 0);  
        tmCliente.setValueAt(contatos.get(i).getNome(), i, 1);  
        tmCliente.setValueAt(contatos.get(i).getTelefone(), i, 2);  
        tmCliente.setValueAt(contatos.get(i).getCpf(), i, 3);  
        tmCliente.setValueAt(contatos.get(i).getEmail(), i, 4);  
        tmCliente.setValueAt(contatos.get(i).getDatanascimento("dd/MM/yyyy"), i, 5);  
        tmCliente.setValueAt(contatos.get(i).getObservacao(), i, 6);  
        tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 7);  
        tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 8);  
          
     }     
}

Se quiser testar comente seu método original e cole esse pra ver.

Observer que aquele while é desnecessário, tendo em vista que você quer limpar a tabela para reinserir novas linhas, sempre escolha usar os métodos que api te fornece.

Segue api da classe JTable

Ae man , deu errado nessa parte aqui .

tmCliente.removeRowSelectionInterval(0, totalLinhas); tmcliente nao reconhece (removeRowSelectionInterval).

[quote=junio103]Ae man , deu errado nessa parte aqui .

tmCliente.removeRowSelectionInterval(0, totalLinhas); tmcliente nao reconhece (removeRowSelectionInterval).[/quote]

Qual exceção ele soltou?

[quote=solidsnake][quote=junio103]Ae man , deu errado nessa parte aqui .

tmCliente.removeRowSelectionInterval(0, totalLinhas); tmcliente nao reconhece (removeRowSelectionInterval).[/quote]

Qual exceção ele soltou?[/quote]

Essa aqui .

cannot find symbol

symbol: method removeRowSelectionInterval(int,int);
location>variable tm Cliente of type DefaultTableModel

[quote=junio103][quote=solidsnake][quote=junio103]Ae man , deu errado nessa parte aqui .

tmCliente.removeRowSelectionInterval(0, totalLinhas); tmcliente nao reconhece (removeRowSelectionInterval).[/quote]

Qual exceção ele soltou?[/quote]

Essa aqui .

cannot find symbol

symbol: method removeRowSelectionInterval(int,int);
location>variable tm Cliente of type DefaultTableModel

[/quote]

Foi mal cara, acabei te passando um método que remove seleção das linhas e não a linha em si, de qualquer forma seu tmCliente não é JTable correto?

Seria melhor voltar o jeito que estava. Foi mal ae.