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;
}
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.
Já havia visto esse link, vi vários alias, mas nenhum resolve esse problema. Acha que convém mudar para o h2?
Eu nem teria pensado no hsqldb.
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.
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.
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…
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=?"
@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
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.
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
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.
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
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.