Galera estou fazendo um CRUD utilizando o Struts2 e também o Hibernate, o mesmo já está salvando as informações na base de dados, mas ao lista o que foi cadastrado está dando o seguinte erro:
Ao debugar, estou vendo que a linda discs = (List)session.createSQLQuery(“from disc”).list(); está vindo “Null” ocorrendo o seguinte erro:
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2231)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
at org.hibernate.loader.Loader.list(Loader.java:2120)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1722)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175)
at brum.mybec.controller.DiscController.list(DiscController.java:43)
at brum.mybec.view.DiscAction.add(DiscAction.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
O método em que isso ocorre é:
[code]
//Metodo responsavel por listar os discos cadastrados na base de dados
public List list() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<Disc> discs = null;
try {
discs = (List<Disc>)session.createSQLQuery("from disc").list();
//discs = (List<Disc>)session.createQuery("select * from disc").list();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}
session.getTransaction().commit();
return discs;[/code]
Pesquisei em outros lugares, mas nao consegui resolver esse problema.
Podem me ajudar?
discs = (List<Disc>)session.createQuery("from Disc").list();
Tenta isso.
Você está tentando executar uma HQL dentro do método que executa uma SQL padrão…
Outra coisa também…
Tente deixar seu DAO o mais genérico possível, acredite, isso ajuda d+.
Já citei esse link em outro post, mas dá uma olhada:
http://www.guj.com.br/java/276957-duvida-com-melhorias-dao-generic-com-hibernate
E também, quando for criar uma query pra listar todos de determinada classe por exemplo, creio que seja melhor assim:
public List findAll(Class classe) throws Exception {
sessao = null;
List lista;
try {
sessao = HibernateUtil.getSessionFactory().openSession();
Criteria criteria = sessao.createCriteria(classe);
lista = criteria.list();
} catch (Exception e) {
throw e;
} finally {
sessao.close();
}
return lista;
}
Você passa o .class que quiser de retorno, no seu caso no parâmetro poderia ser:
Lista<Disc> discos = dao.list(Disc.class);
O erro agora mudou está dando o seguinte:
org.hibernate.hql.ast.QuerySyntaxException: disc is not mapped [from disc]
at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181)
at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)
at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:277)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:251)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134)
at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at
Não é estranho dizer que minha classe nao está mapeada sendo que eu consigo salvar?
Tentou fazer pelo .class? Não utilizei muita HQL ainda… mas até onde imagino a HQL é case sensitive… então tenta usar com D maiusculo no “from Disc”.
Tente com
("from pacote.Disc").list();
Tentei e nada.
e a query está certa, eu busco direto no banco e consigo com o select * from disc;