Consulta SQL retorna apenas uma cidade por estado, precisa retornar todas cidade

21 respostas
javamysql
D

Ola galera, fiz uma consuta pra retornar todas as cidade de um estado, porem gostaria de retornar apenas as cidades de um estado especifico quando seleciono.
Como fazer?

Classe CidEstDao

public Cidade getCidadeByEstado(String nom_cidade) throws SQLException {
        String select = "SELECT * FROM cidade WHERE estado = ?";
        Cidade cidade = null;
        PreparedStatement stmt = getConnection().prepareStatement(select);
			
        stmt.setString(1, nom_cidade);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            cidade = new Cidade();
            cidade.setNom_cidade(rs.getString("nom_cidade"));
        }
        rs.close();
        stmt.close();
        return cidade;
    }

Classe CidEstController

public Cidade buscaCidadePorEstado (String nom_cidade) throws SQLException{
		CidEstDao dao = new CidEstDao();
		return (Cidade) dao.getCidadeByEstado(nom_cidade);
	}

Classe principal

private void onClickLocalizar() {
        CidEstController cc = new CidEstController();
        try {
            Cidade c = (Cidade) cc.buscaCidadePorEstado("São Paulo");

            String cidade = c.getNom_cidade();
            System.out.println(cidade);
           
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this,	"Ocorreu um erro, tente novamente!n" +
				e.getLocalizedMessage()
			);
        } catch (NullPointerException e){
            JOptionPane.showMessageDialog(this, "Contato não localizdo ou não existe!n" + 
				e.getLocalizedMessage()
			);
        }
    }

21 Respostas

J

SELECT cidade FROM cidades WHERE estado = ?

D

Foi alterado e continua retornando apenas a ultima cidade da tabela.

J

Entendi, no caso o problema que você está sempre sobrescrevendo seu objeto, uma solução possível seria:

List<Cidade> cidades = new LinkedList();
     while (rs.next()) {
                cidade = new Cidade();
cidade.setNom_cidade(rs.getString("nom_cidade"))
                cidades.add(cidade);
            }

Enquanto estiver no while ele ira sobrescrever o objeto anterior. Nesta situação, ele ira manter o objeto na lista.

M

isso, trabalharia com array… mas man, vc tá usando certo a variável nom_cidade? pq hora vc usa como variável de cidade, hora como variável de estado, ex:

<>

String select = SELECT * FROM cidade WHERE estado = ?;		

stmt.setString(1, nom_cidade);

<>
cidade.setNom_cidade(rs.getString(“nom_cidade”));

posso estar falando besteira, mas espero ajudar

D

Esta sim, vou explciar

A tabela se chama cidade
A coluna se chama nom_cidade
E tem uma coluna estado onde contem o estado referente a cidade

Eu alterei conforme o jonathan.sky disse e esta dando erro refetente a minha tela principal, vou postar aqui como esta as tres classes

Classe CitEstDao

public List<Cidade> getCidadeByEstado(String nom_cidade) throws SQLException {
        String select = "SELECT nom_cidade FROM cidade WHERE estado = ?";
        Cidade cidade = null;
        PreparedStatement stmt = getConnection().prepareStatement(select);
        List<Cidade> cidades = new LinkedList<Cidade>();	
        stmt.setString(1, nom_cidade);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            cidade = new Cidade();
            cidade.setNom_cidade(rs.getString("nom_cidade"));
            cidades.add(cidade);
        }
        rs.close();
        stmt.close();
        return cidades;
    }

Classe Controller

public List<Cidade> buscaCidadePorEstado (String nom_cidade) throws SQLException{
		CidEstDao dao = new CidEstDao();
		return  dao.getCidadeByEstado(nom_cidade);
	}

Classe principal teste

private void onClickLocalizar() {
        CidEstController cc = new CidEstController();
        try {
            Cidade c = (Cidade) cc.buscaCidadePorEstado("São Paulo");

            String cidade = c.getNom_cidade();
            System.out.println(cidade);
           
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this,	"Ocorreu um erro, tente novamente!n" +
				e.getLocalizedMessage()
			);
        } catch (NullPointerException e){
            JOptionPane.showMessageDialog(this, "Contato n&atilde;o localizdo ou n&atilde;o existe!n" + 
				e.getLocalizedMessage()
			);
        }
    }

tela de erro

Exception in thread AWT-EventQueue-0 java.lang.ClassCastException: java.util.LinkedList cannot be cast to Cidade

at teste.onClickLocalizar(teste.java:30)

at teste.access$0(teste.java:27)

at teste$2.actionPerformed(teste.java:73)
J

você está devolvendo um List e não cidade.

List cidades = cc.buscaCidadePorEstado("São Paulo");

para percorrer, tenha em mente a priorização do enhanced for, pois ele percorrer usando Iterator, por exemplo:

forEach(Cidade cidade: cidades){
       cidade.getNome();
}

Em alguns tipos ele poderá ser uma mão na roda.

D

Infelizmente por causa do campo String nom_cidade do metodo getCidadeByEstado

quando instancio na classe principal, esta dando erro.
Alguem pode me ajudar?

J

O erro vem por que a variavel nom_cidade não foi instanciada, ou seja, ela está null. Uma solução seria:

private String nom_cidade = "são paulo"

D

Continua dando o mesmo erro.


Alguem pode me ajudar a como consultar a tabela cidade conforme a coluna estado?

M

mano, eu tava dando uma olhada… vc colocou SELECT * FROM cidade WHERE estado = ?
nao seria SELECT nom_cidade FROM cidade WHERE estado = ? pq vc quer somente o nome da cidade de determinado estado, não é? ai se o estado fosse SP ele iria retornar itupeva, jundiai, sao paulo, cabreuva, etc

D

ja alterei, coloquei nom_cidade mas continua dando erro, no dao ou no principal.

Eu agradeço a todos pela força mas todas as allternaticas acima estao retornando erro.

J

não é erro, você também deve tratar a exceção que está sendo jogada

throws SQLException

D

Olha na linha 19 por favor.

J

Isso mesmo,
https://www.caelum.com.br/apostila-java-orientacao-objetos/excecoes-e-controle-de-erros/#11-1-motivacao

Se a exceção não for tratada em nenhum nível e lançada de camada em camada a ide vai continuar te avisando.
clicka na lampada, ele ira te pedir para adicionar um try-catch ou cobrir ele para jogar em quem chamar. E além disso tem uma outra coisa, você só pode chamar um método de uma outra classe dentro de algum método ou na main.

D

R
private void onClickLocalizar() {
    CidEstController cc = new CidEstController();
    try {
        List<Cidade> c = (Cidade) cc.buscaCidadePorEstado("São Paulo");
        for(Cidade cidade : c)
        System.out.println(c.getNom_cidade());
       
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(this,	"Ocorreu um erro, tente novamente!n" +
			e.getLocalizedMessage()
		);
    } catch (NullPointerException e){
        JOptionPane.showMessageDialog(this, "Contato n&atilde;o localizdo ou n&atilde;o existe!n" + 
			e.getLocalizedMessage()
		);
    }
}
D

Sinceramente eu to quase desistindo, revirei a internet, ja fiz milhares de formas pra consuta mas estou mantendo essa

Classe DAO

public List<Cidade> getCidadeByEstado(String nom_cidade) throws Exception {
        String select = "SELECT nom_cidade FROM cidade WHERE estado = ?";
        Cidade cidade = null;
        PreparedStatement stmt = getConnection().prepareStatement(select);
        List<Cidade> cidades = new ArrayList<Cidade>();	
        stmt.setString(1, nom_cidade);
        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            cidade = new Cidade();
            cidade.setNom_cidade(rs.getString("nom_cidade"));
            cidades.add(cidade);
        }
        rs.close();
        stmt.close();
        return cidades;
    }

Classe Controller

public class CidEstController {

	public List<Cidade> buscaCidadePorEstado (String nom_cidade) throws Exception{
		CidEstDao dao = new CidEstDao();
		return  dao.getCidadeByEstado(nom_cidade);
	}

Classe Principal

private void onClickLocalizar() throws Exception {
	    CidEstController cc = new CidEstController();
	    try {
	        List<Cidade> c = cc.buscaCidadePorEstado("São Paulo");
	        for(Cidade cidade : c)
	        System.out.println(((Cidade) c).getNom_cidade());
	       
	    } catch (SQLException e) {
	        JOptionPane.showMessageDialog(this,	"Ocorreu um erro, tente novamente!n" +
				e.getLocalizedMessage()
			);
	    } catch (NullPointerException e){
	        JOptionPane.showMessageDialog(this, "Contato n&atilde;o localizdo ou n&atilde;o existe!n" + 
				e.getLocalizedMessage()
			);
	    }
	}

Se alguem souber fazer uma consulta com array pra que retorne mais de uma informação eu agradeço.

R

Na verdade fui eu que errei

private void onClickLocalizar() {
    CidEstController cc = new CidEstController();
    try {
        List<Cidade> c = (Cidade) cc.buscaCidadePorEstado("São Paulo");
        for(Cidade cidade : c)
        System.out.println(cidade.getNom_cidade()); // aqui estava meu erro. coloquei a variavel c e correto é cidade.
       
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(this,	"Ocorreu um erro, tente novamente!n" +
			e.getLocalizedMessage()
		);
    } catch (NullPointerException e){
        JOptionPane.showMessageDialog(this, "Contato n&atilde;o localizdo ou n&atilde;o existe!n" + 
			e.getLocalizedMessage()
		);
    }
}
J

Acredito que essa conversão esteja errada, pois o busca Por estado devolve o tipo lista, se fizer isso dará erro de conversão.

`List<Cidade> c = (Cidade) cc.buscaCidadePorEstado("São Paulo");`
`List<Cidade> c = cc.buscaCidadePorEstado("São Paulo");`
P

Além da conversão citada pelo jonathan.sky, acredito que seria interessante você testar sua consulta no banco primeiro para ver se realmente está retornando o resultado como você quer.
Meu primeiro post no forum, espero estar contribuindo :slight_smile:

D

Deu praticamente tudo certo, ele retornou os estados mas apenas imprime se o comando estiver dentro do método.

Eu alterei ele de varias formas como:

1 - public List onClickLocalizarCidadePorEstado() throws Exception {

2 - public List onClickLocalizarCidadePorEstado(Strint nome) throws Exception {

mas nehuma das vezes eu consigo pegar o metodo para relacionar a uma combobox
e tbm criei um mesmo MODELO de consulta pra retornar uma quantidade de produtos X pra somar mas como não consigo trabalhar com o retorno do metodo eu to meio perdidao.

Alguem pode me ajudar?
Espero ter sido claro.

Criado 17 de maio de 2017
Ultima resposta 20 de mai. de 2017
Respostas 21
Participantes 5