Olá pessoal, bom dia
Estou começando a estudar Oracle e resolvi desenvolver um projeto em Java para manipulação de um pequeno banco de dados utilizando Hibernate no Netbeans 7.3.
O problema é que ao testar a consulta HQL o hibernate não gera o script SQL, no visualizador aparece sempre “select from” e mais nada.
Este é o meu hibernate.cfg
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="hibernate.connection.username">seguradora</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
<property name="hibernate.connection.password">seguradora</property>
<property name="hibernate.connection.datasource">seguradora</property>
<property name="hibernate.default_schema">seguradora</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<mapping class="" file="" jar="" package="" resource="entity.Seguradora.hbm.xml"/>
<mapping class="" file="" jar="" package="" resource="entity.Config.hbm.xml"/>
</session-factory>
</hibernate-configuration>
E estes são os hbm de mapeamento:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 25/04/2013 21:40:49 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class name="entity.Config" table="CONFIG" schema="SEGURADORA">
<id name="idConfig" type="byte">
<column name="ID_CONFIG" precision="2" scale="0" />
<generator class="assigned" />
</id>
<property name="maquina" type="string">
<column name="MAQUINA" length="2" unique="true" />
</property>
<property name="host" type="string">
<column name="HOST" length="20" />
</property>
<property name="porta" type="string">
<column name="PORTA" length="10" />
</property>
<property name="sid" type="string">
<column name="SID" length="10" />
</property>
<property name="usuario" type="string">
<column name="USUARIO" length="20" />
</property>
<property name="senha" type="string">
<column name="SENHA" length="20" />
</property>
</class>
</hibernate-mapping>
e
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 25/04/2013 21:40:49 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
<class name="entity.Seguradora" table="SEGURADORA" schema="SEGURADORA">
<id name="id_Seguradora" type="byte">
<column name="ID_SEGURADORA" precision="2" scale="0" />
<generator class="assigned" />
</id>
<property name="cnpj" type="string">
<column name="CNPJ" length="18" unique="true" />
</property>
<property name="inscricao_estadual" type="string">
<column name="INSCRICAO_ESTADUAL" length="18" />
</property>
<property name="endereco" type="string">
<column name="ENDERECO" length="35" />
</property>
<property name="numero" type="string">
<column name="NUMERO" length="6" />
</property>
<property name="complemento" type="string">
<column name="COMPLEMENTO" length="20" />
</property>
<property name="bairro" type="string">
<column name="BAIRRO" length="20" />
</property>
<property name="cidade" type="java.lang.Long">
<column name="CIDADE" precision="10" scale="0" />
</property>
<property name="uf" type="string">
<column name="UF" length="2" />
</property>
<property name="cep" type="string">
<column name="CEP" length="2" />
</property>
<property name="contato" type="string">
<column name="CONTATO" length="20" />
</property>
</class>
</hibernate-mapping>
Alguém poderia me ajudar com este problema ?
Não use: <property name="hibernate.hbm2ddl.auto">create-drop</property> O create-drop vai excluir suas tabelas sempre que sua sessionfactory for chamada. Altere a propriedade para: update
Quando trabalhei com Oracle, eu mapeava o id assim:
<id name="id" column="ID_CIDADE" type="long" >
<generator class="sequence">
<param name="sequence">SEQ_CIDADES</param>
</generator>
</id>
Onde SEQ_CIDADES seria a sequencia criada no Oracle. Tem certeza que o Oracle trabalha com <generator class=“assigned” />?
Eu criei as entidades com o assistente do Netbeans e pelo visto ele não importou as sequências, pois elas existem lá.
Vou fazer as mudanças aqui.
Mas será que isto está diretamente ligado ao problema do Editor de Consultas HQL, porque como havia falado no início do tópico ele não está gerando as consultas SQL corretamente.
Por exemplo quando digito a HQL: “from seguradoras” se verificar o SQL que foi gerado aparece apenas “select from” e quando tento executar o seguinte erro é retornado:
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2223)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.hql.classic.QueryTranslatorImpl.list(QueryTranslatorImpl.java:912)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00936: expressão não encontrada
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:863)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1275)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3620)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)
... 8 more
Talvez esteja ligado sim, se o mapeamento estiver errado por exemplo.
Mas ele deveria mostrar algo assim
Hibernate:
select
this_.ID as ID0_0_,
this_.APELIDO as APELIDO0_0_,
this_.DATA_NASCIMENTO as DATA3_0_0_,
this_.NOME as NOME0_0_
from
CONTATOS this_
As colunas e a tabela que está consultado.
Outra coisa, preste atenção no HQL: “from seguradoras”
Você deve usar “from Seguradora”, porque se usa o nome da classe e/ou propriedades da classe e não o nome e/ou colunas da tabela.
A questão do HQL: “from seguradoras” foi apenas um erro de digitação mesmo. Estou testando com “from seguradora” e Hibernate realmente não está gerando o SQL.
Vou conferir os mapeamentos e continuar quebrando a cabeça, quando descobrir o problema posto aqui.
Olá pessoal, boa tarde
Depois de alguns testes sem sucesso com o HQL eu resolvi fazer testes utilizando SQL puro e para minha surpresa alguns erros foram apontados na configuração do Hibernate e no mapeamento das classes.
No hibernate.cfg faltava a seguinte propriedade:
<property name="hibernate.current_session_context_class">thread</property>
E no mapeamento tinha um ou outro erro de sintaxe.
Bom agora eu consigo realizar consultas por meio de SQL puro normalmente, mas com HQL ainda não funciona e gera o seguinte erro:
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2223)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.hql.classic.QueryTranslatorImpl.list(QueryTranslatorImpl.java:912)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at dao.SeguradoraDAO.listSeguradoras(SeguradoraDAO.java:43)
at dao.SeguradoraDAO.main(SeguradoraDAO.java:23)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00936: expressão não encontrada
A minha pergunta é: tendo o sistema executado um SQL puro, não deveria também executar consultas HQL? Existe algum outro tipo de configuração ou parâmetro que eu deva considerar em relação a este tipo de erro ?
Os comandos utilizado para reproduzir este erro foram os seguintes:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from seguradora");
O correto é Seguradora e não seguradora. Tem que usar o nome idêntico ao da classe.
Muito obrigado pela dica romarcio, era exatamente isso. Apesar de no Editor de Consultas HQL não gerar o SQL ainda (talvez por algum problema no NetBeans) quando executo a consulta na classe funciona corretamente.
Obrigado!!