Hibernate + SQLServer = Bug?

13 respostas
Arcadex

Uso o hibernate + spring e minha aplicação conecta (sem problemas) com 3 banco de dados.
Oracle, Sybase 12.0 e SQLServer 2000

Estou tendo um problema que está me cheirando a [color=darkred]BUG[/color].
Meus métodos são todos paginados… setFirstResult e setMaxResults.

Mas, somente no SQLServer tenho problemas.
Qdo coloco setFirstResult(x); sendo x > 0, ele dá erro.

Por exemplo, se quero pegar do registro 10 ao 20.
Faço:

query = getHibernateTemplate().getNamedQuery(getSession(), "IntrInventario.findAll"); query.setFirstResult(10); query.setMaxResults(20); result = query.list();
no sql ele faz:

select top 30 intrinvent0_.id_chave as id_chave, intrinvent0_.id_chave_Rede as id_chave2_, intrinvent0_.ds_microcomputador as ds_micro3_, intrinvent0_.ds_ativo as ds_ativo, intrinvent0_.ds_serie as ds_serie, intrinvent0_.ds_local_fisico as ds_local6_, intrinvent0_.ds_nota_fiscal as ds_nota_7_, intrinvent0_.ds_lotacao as ds_lotacao from vwCSTInventarioHW intrinvent0_

Mas somente qdo o query.setFirstResult(X) tem X >0 dá o erro:

net.sf.hibernate.exception.SQLGrammarException: Could not execute query at net.sf.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:58) at net.sf.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29) at net.sf.hibernate.impl.SessionImpl.convert(SessionImpl.java:4131) at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1557) at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java:49) at br.com.polaris.intradesk.dao.Hibernate.IntrInventarioDAOImpl.findAll(IntrInventarioDAOImpl.java:54) at br.com.polaris.intradesk.business.Impl.IntradeskImpl.IntrInventarioFindAll(IntradeskImpl.java:88) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:284) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:56) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174) at $Proxy2.IntrInventarioFindAll(Unknown Source) at br.com.polaris.intradesk.business.test.IntrInventarioTest.testFindAllPage(IntrInventarioTest.java:111) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:421) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:305) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:186) [color=darkblue]Caused by: java.sql.SQLException: Invalid column name id_chave2_.[/color]

Caso eu coloque query.setFirstResult(0); Executa sem problemas
Nos bancos de dados Oracle e Sybase, eu faço identico e não ocorre nenhum erro.

[size=18]Será BUG ???[/size]

13 Respostas

_fs

Hum, realmente estranho. Aqui no sql server 2003 funciona na boa.

Só por curiosidade, pode postar a query ‘IntrInventario.findAll’?

S

Eu realmente não posso ajudar nesse momento, porque eu não sei, mas outra coisa me chamou atenção.
Se estiver dentro da sua possibilidade, poderia mostrar como que fica o seu “hibernate.cfg.xml” visto que eu tenho “n” filiais e gostaria de conectar a elas, mas os bancos ficam fisicamente em locais separados.
Não sei se me entendeu…Desculpe destorcer o conteúdo do seu tópico, mas ficaria agradecido se puder nos ajudar, mesmo que seja rapidamente. Se tiver algum link que mostre mais agradecido ainda…
Obrigado desde Já.

Arcadex

LIPE:
Hum, realmente estranho. Aqui no sql server 2003 funciona na boa.

Só por curiosidade, pode postar a query ‘IntrInventario.findAll’?

O findAll é bem simples:

from Inventario

O nome da classe é Inventario.

Arcadex

supinet:
Se estiver dentro da sua possibilidade, poderia mostrar como que fica o seu “hibernate.cfg.xml” visto que eu tenho “n” filiais e gostaria de conectar a elas, mas os bancos ficam fisicamente em locais separados.

Eu uso o spring…
Não tenho o arquivo “hibernate.cfg.xml”. O Spring abstrai isso p/ mim.
No site do Hibernate tem referencia p/ o Spring.
Mas tah aqui o site dele:
http://www.springframework.org/

Arcadex

Lipe,

procurei bastante referencia sobre Bug do Hibernate, mas n vi nada relacionado a essa paginação.
[color=red]Vc já usou, ou alguem aí já usou essa função “setFirstResult” no SQLServer 2000 ?[/color]

Agradeço os comentários…

mister_m

Você pode postar os trechos relevantes da configuração do Spring referentes à integração com o Hibernate?

Arcadex

Voce poderia criar um novo tópico para isso? Aí vc me fala (msg privada).
Participo numa boa. Não tem como postar trechos “relevantes”. Tudo é relevante e a configuração do Spring é meio grandinha.

Mas vale a pena!!!
Spring + Hibernate = nota 20. Até melhora a funcionalidade do Hibernate.
Nem me preocupo com controle de transação.
Tenho funções no meu sistema que trabalha em cima de 2 ou 3 bancos diferentes (em servidores diferentes…)

_fs

Uso e funciona tranquilamente.

Tenta fazer assim

Criteria c = session.createCriteria( Inventario.class );
c.setFirstResult(10);
c.setMaxResults(20);
result	= c.list();
Arcadex

LIPE:
Uso e funciona tranquilamente.

Tenta fazer assim

Criteria c = session.createCriteria( Inventario.class ); c.setFirstResult(10); c.setMaxResults(20); result = c.list();

Valeu Lipe pela dica, mas ocorreu o mesmo erro!
[color=red]Unable to perform find
Invalid column name id_chave2_.[/color]
Engraçado que ele renomeia as colunas na query que ele mesmo monta e reclama que não encontrou id_chave2_.

Olha o sql executado pelo Hibernate:

select top 30 intrinvent0_.id_chave as id_chave, intrinvent0_.id_chave_Rede as id_chave2_, intrinvent0_.ds_microcomputador as ds_micro3_, intrinvent0_.ds_ativo as ds_ativo, intrinvent0_.ds_serie as ds_serie, intrinvent0_.ds_local_fisico as ds_local6_, intrinvent0_.ds_nota_fiscal as ds_nota_7_, intrinvent0_.ds_lotacao as ds_lotacao from vwCSTInventarioHW intrinvent0_

Poderia ser problema de driver??? :?:
Poderia ser problema de … :?:
Nem tenho mais idéia. rsrsrsrs :shock:

Tentei debugar o Hibernate mas não consigo fazer o eclipse mostrar o fonte dele.

mister_m

Qual as versões do Hibernate e do Spring que você está usando?

Arcadex

Deu erro nas versões:
Hibernate: hibernate-2.1
Spring: spring-framework-1.1

Mas acabei de fazer o teste migrando p/ as versões mais novas (mas sem resultado):
Hibernate: hibernate-2.1.8
Spring: spring-framework-1.1.5

Arcadex

LIPE:
Uso e funciona tranquilamente.

Tenta fazer assim

Criteria c = session.createCriteria( Inventario.class ); c.setFirstResult(10); c.setMaxResults(20); result = c.list();

Lipe, qual o driver que vc usa p/ conectar sua aplicação c/ o SQLServer 2000 ? Qual o nome do JAR?

Arcadex

Obrigado a Todos Participantes.

O drive que uso é o jtds (jtds.sourceforge.net).
Mudei da versão 0.9-rc1 para 1.0.2.

Resolvido o problema… :smiley:

Valeu Lipe.

Criado 5 de abril de 2005
Ultima resposta 14 de abr. de 2005
Respostas 13
Participantes 4