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ão localizdo ou nã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ão localizdo ou nã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ão localizdo ou nã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ão localizdo ou nã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");`