(Resolvido)Problemas de Conexão com HSQLDB?

13 respostas
javahsqldb
R

Salve galera, estou com um projeto em Java Swing + Maven, estava utilizando MySQL no desenvolvimento porém na hora de mandar pra distribuição descobri o detalhe da licença. Fui procurar outros BD e descobri o HSQLDB e que ele consegue ser embutido no jar da aplicação. Fiz toda a instalação, adicionei ao Maven a Biblioteca Jar e as conf. de conexão.
Porém ele ta me retornando um erro de privilégio.

2019-04-09T14:31:18.226-0300 SEVERE null
java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: >USUARIO in statement [SELECT * FROM USUARIO WHERE usu=? AND senha=?]

Já executei o comando Shutdown ao fim da SQL e nada, a tabela existe tanto no servidor do projeto tanto quanto no runManagerSwing, ela está alimentada com dados tbm. Mas na hora de acessar o login do sistema me retorna esse erro.

Classe de conexão

public Connection conexao(){
        Connection con = null;
        try{
            Class.forName("org.hsqldb.jdbcDriver");
            con = DriverManager.getConnection("jdbc:hsqldb:file:base/exatobd", "root", "admin");
        }catch(Exception ex){
            System.out.println("erro: " + ex);
        }
        return con;
    }

Usuario DAO

public boolean checkLogin(String usu, String senha){
        Connection con = conex.conexao();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        boolean check = false;
        
        try {
            stmt = (PreparedStatement) con.prepareStatement("SELECT * FROM USUARIO WHERE usu=? AND senha=?");
            stmt.setString(1, usu);
            stmt.setString(2, senha);
            
            rs = stmt.executeQuery();
            
            if(rs.next()){
                check = true;
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return check;
   }

13 Respostas

D

Nunca usei o hsqldb, prefiro o h2, muito simples de se usar (e parecido com o mysql em sua sintaxe).
Quanto ao erro, me parece ser algo referente aos privilégios de acesso ao banco

Aqui talvez você encontre uma opção.

R

Já havia visto esse link, vi vários alias, mas nenhum resolve esse problema. Acha que convém mudar para o h2?

D

Eu nem teria pensado no hsqldb.

S

O nome da tabela USUARIO é todo em maiúsculo mesmo?
Se não me engano o HSQLDB é case sensitive, então se na sua query você não pôr o nome da tabela e das colunas entre aspas, ele joga tudo pra uppercase.

T

O HSQLDB é case sensitive como o @staroski falou.
A mensagem de erro é que a tabela USUARIO não existe para o banco exatodb.
Verifique se esta tabela existe no banco de dados no local indicado base/exatodb que está na getConnection.

R

O nome da tabela USUARIO é todo em maiúsculo mesmo?
Se não me engano o HSQLDB é case sensitive, então se na sua query você não pôr o nome da tabela e das colunas entre aspas, ele joga tudo pra uppercase .

Fiz a alteração como você disse, coloquei aspas duplas na criação da tabela (nomes e colunas) Foi criado uma tabela Public.usuario.

Alterei também a chamada da SQL para buscas dos dados, coloquei aspas duplas no nome do banco e nas colunas. Está assim…
Classe Connection

>  public Connection conexao(){
>         Connection con = null;
>         try {
>             Class.forName("org.hsqldb.jdbcDriver");
>             con  = DriverManager.getConnection("jdbc:hsqldb:file:/base/exatobd", "Sa", "");
>             System.out.println("ok");
>         } catch (ClassNotFoundException ex) {
>             Logger.getLogger(ConexaoBD.class.getName()).log(Level.SEVERE, null, ex);
>         } catch (SQLException ex) {
>             Logger.getLogger(ConexaoBD.class.getName()).log(Level.SEVERE, null, ex);
>         }
>         return con;
>     }

Checklogin

public boolean checkLogin(String usu, String senha){
        Connection con = conex.conexao();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        boolean check = false;
        
        try {
            stmt = (PreparedStatement) con.prepareStatement("SELECT * FROM \"PUBLIC.usuario\" WHERE \"usu\"=? AND \"senha\"=?");
            stmt.setString(1, usu);
            stmt.setString(2, senha);
            
            rs = stmt.executeQuery();
            
            if(rs.next()){
                check = true;
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return check;
   }

e está retornando o mesmo erro, já tentei sem o Public. também, deixei só usuario e nada…

T

Para o HSQLDB a sua query está escrita de forma errada.
A indicação do nome da tabela deve ser sempre em maiúscula.
Para os campos o HSQLDB aceita ambas (maiúscula/minúscula).
O correto é:

"SELECT * FROM "PUBLIC"."CONTATO" WHERE usu=? AND senha=?"

ou

"SELECT * FROM CONTATO WHERE usu=? AND senha=?"

ou

"SELECT * FROM "CONTATO" WHERE usu=? AND senha=?"
R

@Trapezus o erro ainda persiste, fiz como você disse mas não deu certo.
Troquei o nome da tabela deixei USUARIO, fiz a conexão dnv. Mas quando clico no botão de login da erro de privilégios ou banco não existe.

UsuarioDAO

public boolean checkLogin(String usu, String senha){
        Connection con = conex.conexao();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        boolean check = false;
        
        try {
            stmt = (PreparedStatement) con.prepareStatement("SELECT * FROM USUARIO WHERE usu = ? AND senha = ?");
            stmt.setString(1, usu);
            stmt.setString(2, senha);
            
            rs = stmt.executeQuery();
            
            if(rs.next()){
                check = true;
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return check;
   }

ConexaoBD

public Connection conexao(){
        Connection con = null;
        try {
            Class.forName("org.hsqldb.jdbcDriver");
            con  = DriverManager.getConnection("jdbc:hsqldb:/base/exatobd", "SA", "");
            System.out.println("ok");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ConexaoBD.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ConexaoBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return con;
    }

Erro

2019-04-10T15:47:45.441-0300  SEVERE  null
java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: USUARIO in statement [SELECT * FROM "USUARIO" WHERE usu = ? AND senha = ?]
	at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
	at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
	at com.ext.dao.UsuarioDAO.checkLogin(UsuarioDAO.java:33)
	at com.ext.gui.LoginGui$9.run(LoginGui.java:239)
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: USUARIO
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.ParserDQL.readTableName(Unknown Source)
	at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source)
	at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source)
	at org.hsqldb.ParserDQL.XreadFromClause(Unknown Source)
	at org.hsqldb.ParserDQL.XreadTableExpression(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
	at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
	at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
	at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
	at org.hsqldb.ParserCommand.compilePart(Unknown Source)
	at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
	at org.hsqldb.Session.compileStatement(Unknown Source)
	at org.hsqldb.StatementManager.compile(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 4 more
T

Entendi o que está ocorrendo. A sua linha do DriverManager tem que estar assim:

con = DriverManager.getConnection("jdbc:hsqldb:file:/base/exatobd", "SA", "");

O HSQLDB utiliza várias formas de acesso ao BD: :mem:, :file:, :hsql: e :http:.
No seu caso acho que é a ausência do :file: na posição que indiquei.
Estou em dúvida com a presença desta “/” entre file: e base.
Faça os testes e avise.
A mensagem de erro ainda indica que a tabela USUARIO não existe no banco de dados.
Verifique se está apontando para a base de dados correta no seu DriverManager e se este BD possui a tabela USUARIO.

R

Foi resolvido, o problema estava com você falou, segui a risca e deu certo.

Comecei do zero, abri o runManagerSwing e criei o banco em standalone na basta correta do meu projeto.
Abri o Netbeans e fiz a conexão com o banco.
Instalei a biblioteca do hsqldb no meu caso fiz pelo Maven.
Criei a classe de conexão utilizando o file: e a pasta do projeto com o arquivo, sem essa “/” de início o meu ficou assim: jdbc:hsqldb:file:bd/extbd
Limpei e construí o projeto, rodei e a conexão funciou…

Depois tive probelma de privilege por causa que a sql estava errada, o hsqldb é muito exigente com esse tipo de coisa. Então utilizei o nome da tabela com nome maiúsculo e o das colunas com nome minúsculo utilizando " " aspas duplas.
Na query do meu usuarioDAO eu fiz da seguinte forma"SELECT * FROM USUARIO WHERE \"usu\" = ? AND \"senha\" = ?" com PrepareStatement e rodou lindamente.

Muito obrigado a vocês pelas dicas e soluções. um abraço

T

Na verdade não precisa destas aspas duplas para o campos.
Pode ser assim mesmo:
"SELECT * FROM USUARIO WHERE usu=? AND senha=?"

Vi agora que no seu Statement está fazendo Casting utilizando (PreparedStatement) e não precisa.
Que bom que conseguiu.
Marque o tópico como resolvido.

R

precisa sim amigo, se eu não coloco as aspas me gera um erro dizendo que não reconhece a variável USU e nem SENHA elas ficam em uppercase

R

DETALHE: Se o erro persistir, clique no banco na área de serviços e clique em executar comando.
Depois digite SHUTDOWN; e execute o comando.

Criado 9 de abril de 2019
Ultima resposta 11 de abr. de 2019
Respostas 13
Participantes 4