O comando do MySQL não roda no Java

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

muito obrigado, amigo!