Quando executo o código: select g.nome, g.cursopreferido, c.nome from gafanhotos g
join g_assiste_c a on g.id = a.idgafanhoto join cursos c on c.idcurso = a.idcurso order by g.nome; no MySQL, ele roda normalmente. Porém, quando acesso o Banco de Dados pelo Java, a linguagem não reconhece o comando.
try {
Class.forName(driver);
conexao = DriverManager.getConnection(url, user, password);
PreparedStatement pesquisa = conexao.prepareStatement("select g.nome, g.cursopreferido, c.nome from gafanhotos g\n" +
" join g_assiste_c a on g.id = a.idgafanhoto join cursos c on c.idcurso = a.idcurso order by g.nome;");
ResultSet resultado = pesquisa.executeQuery();
while(resultado.next()){
String nome = resultado.getString("gafanhotos.nome");
String cursopreferido = resultado.getString("gafanhotos.cursopreferido");
String nomedocurso = resultado.getString("curso.nome");
System.out.println("Nome: " + nome);
System.out.println("Curso preferido: " + cursopreferido);
System.out.println("Nome do Curso: " + nomedocurso);
}
return conexao;
}
Alguém sabe se existem certos comandos de Bancos de Dados que o Java ou a IDE, no caso tô usando o NetBeans, não consegue executar?
Sua variável se chama g
mas você está digitando gafanhoto
pra acessar os valores.
sim, mas eu defini “g” como o apelido de gafanhotos, logo, quando uso “g”, me refiro a gafanhotos. É um jeito de “ter q escrever menos”, eu acho.
Pois é mas na hora de ler os resultados você não está usando o apelido, você está fazendo
resultado.getString("gafanhotos.nome")
Deveria
resultado.getString("g.nome")
eu já tentei isso antes, também não resolveu
No getString
você não usa os apelidos, somente o nome final que o resultado da query tem.
Quando você faz select g.nome
, o nome da coluna resultante é apenas nome
, então seria apenas getString("nome")
, mas tem outro porém, pois na sua query vai ter duas colunas com o mesmo nome: tanto g.nome
quanto c.nome
terão o mesmo nome (que é nome
), então eu sugiro diferenciá-los na query. Algo assim:
Connection conexao = DriverManager.getConnection(url, user, password);
PreparedStatement pesquisa = conexao.prepareStatement("SELECT g.nome AS nome_gafanhoto, g.cursopreferido, c.nome AS nome_curso "
+ " FROM gafanhotos g JOIN g_assiste_c a ON g.id = a.idgafanhoto JOIN cursos c ON c.idcurso = a.idcurso ORDER BY g.nome");
ResultSet resultado = pesquisa.executeQuery();
while (resultado.next()) {
String nome = resultado.getString("nome_gafanhoto");
String cursopreferido = resultado.getString("cursopreferido");
String nomedocurso = resultado.getString("nome_curso");
System.out.println("Nome: " + nome);
System.out.println("Curso preferido: " + cursopreferido);
System.out.println("Nome do Curso: " + nomedocurso);
}
Ou seja, agora a coluna g.nome
passa a se chamar nome_gafanhoto
, e c.nome
é nome_curso
, e esses são os nomes que eu uso no getString
.
Outro detalhe é que não faz muito sentido ter esse return conexao
no final. A conexão já foi usada e não tem motivo para retorná-la, você poderia fechá-la em vez disso:
String query = "SELECT g.nome AS nome_gafanhoto, g.cursopreferido, c.nome AS nome_curso "
+ " FROM gafanhotos g JOIN g_assiste_c a ON g.id = a.idgafanhoto JOIN cursos c ON c.idcurso = a.idcurso ORDER BY g.nome";
try (Connection conexao = DriverManager.getConnection(url, user, password);
PreparedStatement pesquisa = conexao.prepareStatement(query);
ResultSet resultado = pesquisa.executeQuery()) {
while (resultado.next()) {
String nome = resultado.getString("nome_gafanhoto");
String cursopreferido = resultado.getString("cursopreferido");
String nomedocurso = resultado.getString("nome_curso");
System.out.println("Nome: " + nome);
System.out.println("Curso preferido: " + cursopreferido);
System.out.println("Nome do Curso: " + nomedocurso);
}
} catch (SQLException e) {
// faz algo (imprime mensagem de erro, etc)
}
Acima usei o bloco try-with-resources (para Java >= 7), que garante que todos os recursos serão devidamente fechados ao seu final (tanto a conexão quanto o PreparedStatement
e o ResultSet
).
2 curtidas