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

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()
			);
        }
    }

SELECT cidade FROM cidades WHERE estado = ?

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

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.

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

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)

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.

Infelizmente por causa do campo String nom_cidade do metodo getCidadeByEstado

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

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"

Continua dando o mesmo erro.


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

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

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.

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

throws SQLException

Olha na linha 19 por favor.

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.

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()
		);
    }
}

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.

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()
		);
    }
}

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");`