Bom dia, meus caros!
Bem, realizei uma pesquisa considerável sobre este assunto, e nada. Por favor, me ajudem a resolver este problema.
Utilizo Vraptor+JPA+Hibernate+MySQL. A intensão é obter uma lista de setores do banco. Dados:
private SQLQuery visualizaQuery;
private final Session session;
public SetorDao(Session session) {
this.session = session;
this.visualizaQuery = this.session.createSQLQuery("SELECT * FROM SETOR");
}
Essa exceção é disparada quando o método abaixo é invocado:
public List<Setor> visualizar() {
List<Setor> setores = visualizaQuery.addEntity("SETOR", Setor.class).list();
return setores;
}
… resultando em : java.sql.SQLException: Column ‘clazz_’ not found
Minha dúvida é: por que do erro quando não existe nenhum campo clazz_ nas minhas tabelas?
Obrigado.
Posta sua classe Setor pra gente dar uma olhada.
Boa pedida, gabrielfrios.
A classe setor é abstrata. Existe uma classe e uma tabela, para cada setor, todas herdando desta:
[code]@Entity
@Table(name=“SETOR”)
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name=“nome”, discriminatorType=DiscriminatorType.STRING)
public abstract class Setor {
@Id @GeneratedValue
private int setor_id;
@Column(length=50)
protected String nome;[/code]
Também há uma tabela SETOR, que contém esses dois campos acima.
Valeu.
Posta a stacktrace tbm, pra gente ver onde exatamente está ocorrendo o erro.
Ok, lá vai:
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
root cause
org.hibernate.exception.SQLGrammarException: could not execute query
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
org.hibernate.loader.Loader.doList(Loader.java:2231)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
org.hibernate.loader.Loader.list(Loader.java:2120)
org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312)
org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1722)
org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175)
br.com.industrial.dao.SetorDao.visualizar(SetorDao.java:28)
br.com.industrial.controller.SetorController.teste(SetorController.java:41)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
root cause
java.sql.SQLException: Column 'clazz_' not found.
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1144)
com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2813)
org.hibernate.type.IntegerType.get(IntegerType.java:51)
org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
org.hibernate.type.NullableType.nullSafeGet(NullableType.java:210)
org.hibernate.loader.Loader.getInstanceClass(Loader.java:1466)
org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308)
org.hibernate.loader.Loader.getRow(Loader.java:1230)
org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:603)
org.hibernate.loader.Loader.doQuery(Loader.java:724)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
org.hibernate.loader.Loader.doList(Loader.java:2228)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
org.hibernate.loader.Loader.list(Loader.java:2120)
org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312)
org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1722)
org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175)
br.com.industrial.dao.SetorDao.visualizar(SetorDao.java:28)
br.com.industrial.controller.SetorController.teste(SetorController.java:41)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:86)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
o que faz esse visualizaQuery.addEntity ?
[quote=diegogeovani]Faz isto, creio eu:
Creio eu?
Posta o método inteiro aí, cara ^^
Segundo a documentação do Hibernate 4:
addEntity
SQLQuery addEntity(String tableAlias,
Class entityType)
Declare a “root” entity
Parameters:
tableAlias - The SQL table alias
entityType - The java type of the entity to add as a root
Returns:
this, for method chaining
Se não é isto, não entendi sua pergunta. =\
Acabou que optei por outra solução, e não entendi por que este problema ocorria.
Antes de reformular o projeto, realizei alguns testes. Este fiz só de curiosidade:
neste trecho, satisfaço o parâmetro [size=9]entityType[/size] do método addEntity com a classe Setor,
[code]public List<Setor> visualizar() {
List<Setor> setores = visualizaQuery.addEntity("SETOR", Setor.class).list();
return setores;
} [/code]
que dispara a exceção: br.com.industrial.dao.SetorDao.visualizar(SetorDao.java:28)
…mas quando passei uma classe filha concreta, como SetorComercial, nenhum erro foi gerado!! :?:
[code]public List<Setor> visualizar() {
List<Setor> setores = visualizaQuery.addEntity("SETOR_COMERCIAL", SetorComercial.class).list();
return setores;
} [/code]
Espero que esse tópico ajude aqueles que encontrarem esse problema pela frente.
Obrigado à todos!
Desculpe não responder antes. Então cara, você realmente não vai conseguir persistir uma classe abstrata no banco. Seria assim mesmo como você está fazendo, passando uma classe concreta para o método.
Acredito até que você possa tirar o @Table da classe abstrata.
[quote=gabrielfrios]Desculpe não responder antes. Então cara, você realmente não vai conseguir persistir uma classe abstrata no banco. Seria assim mesmo como você está fazendo, passando uma classe concreta para o método.
Acredito até que você possa tirar o @Table da classe abstrata.[/quote]
Agora fiquei com outra dúvida mano.
Posso garantir pra você que consiqui persistir minha classe abstrata Setor(definida da mesma forma no início do tópico) com o método abaixo!
public void inserir(Setor setor) {
transaction = session.beginTransaction();
session.save(setor);
transaction.commit();
}
Não estava com problemas na hora de persistir, e sim de consultar: [quote] A intensão é obter uma lista de setores do banco.[/quote]
A estratégia [color=darkblue].JOINED[/color] cria uma tabela para a classe Setor.
Acho que o motivo não é esse. Vlw pela atenção, gabrielfrios !
Então, mas qual objeto vc estava passando no método? Com certeza não era um Setor, apesar dele receber um. Pq vc não pode instanciar uma classe abstrata. Sendo assim vc estaria passando um objeto que passe no teste É-UM para a classe Setor.
Correto?
[quote=gabrielfrios]Então, mas qual objeto vc estava passando no método? Com certeza não era um Setor, apesar dele receber um. Pq vc não pode instanciar uma classe abstrata. Sendo assim vc estaria passando um objeto que passe no teste É-UM para a classe Setor.
Correto?[/quote]
Você tem razão, não era.
Esqueci desse grande detalhe.
Mas então, como consultar os dados de uma tabela gerada a partir de uma classe mãe abstrata, como Setor?
Na verdade você teria que persistir uma classe concreta. Mesmo seu método recebendo a classe abstrata.
É, tenho que estudar mais o mapeamento de herança com Hibernate+JPA.
Vlw gabrielfrios ! Parei por hoje. 8)