Problema HQL

32 respostas
R

Olá pessoal,

estou com um problema com uma query e não consigo resolver. Será que alguem conseguiria me ajudar?
A query é a seguinte:

StringBuffer sql = new StringBuffer();  
sql.append(" update Projeto set status = :status ");  
sql.append(" where acaoAtividadeDaRelacaoDeIntencao.numeroDoGrupoModular = :grupoModular ");  
sql.append(" and acaoAtividadeDaRelacaoDeIntencao.acaoAtividade.numeroDoModulo > :numeroModulo ");  

Query query = getSession().createQuery(sql.toString());  
query.setParameter("grupoModular", projeto.getAcaoAtividadeDaRelacaoDeIntencao().getNumeroDoGrupoModular());  
query.setParameter("numeroModulo", projeto.getAcaoAtividadeDaRelacaoDeIntencao().getAcaoAtividade().getNumeroDoModulo());  
query.setParameter("status", TipoDeStatusDoProjeto.CANCELAMENTO_ACEITO);  
query.executeUpdate();

E a mensagem de erro é a seguinte:

10:24:42,031 ERROR [JDBCExceptionReporter] ERROR: syntax error at or near ","  
10:24:49,187 FATAL [DaoInterceptor      ] factory has transaction. ROLLBACK!  
25/08/2009 10:24:49 org.apache.catalina.core.StandardWrapperValve invoke  
SEVERE: Servlet.service() for servlet vraptor2 threw exception  
org.postgresql.util.PSQLException: ERROR: syntax error at or near ","

Diz que há um erro de sintaxe no código decorrente de uma ‘,’. Mais notem, não têm nenhuma ‘,’ no codigo HQL!

Não entendo o que está acontecendo.

32 Respostas

R

Coloque toda a stack trace. Talvez tenha alguma coisa que ajude mais embaixo.

R
10:24:42,031 ERROR [JDBCExceptionReporter] ERROR: syntax error at or near ","
10:24:49,187 FATAL [DaoInterceptor      ] factory has transaction. ROLLBACK!
25/08/2009 10:24:49 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet vraptor2 threw exception
org.postgresql.util.PSQLException: ERROR: syntax error at or near ","
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1608)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1343)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:194)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
	at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:98)
	at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:419)
	at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:283)
	at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1168)
	at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:117)
	at br.com.faespsenar.sicp.dao.ProjetoDao.cancelarModulosPosteriores(ProjetoDao.java:1543)
	at br.com.faespsenar.sicp.logic.ProjetoAprovadoLogic.frame(ProjetoAprovadoLogic.java:688)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:61)
	at org.vraptor.interceptor.ExecuteLogicInterceptor.intercept(ExecuteLogicInterceptor.java:32)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:130)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:41)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:57)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at br.com.faespsenar.sicp.interceptor.DownloadInterceptor.intercept(DownloadInterceptor.java:39)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at br.com.faespsenar.sicp.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:37)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at br.com.faespsenar.sicp.interceptor.FactoryInterceptor.intercept(FactoryInterceptor.java:20)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at br.com.faespsenar.sicp.interceptor.DaoInterceptor.intercept(DaoInterceptor.java:41)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.FlashScopeInterceptor.intercept(FlashScopeInterceptor.java:22)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.interceptor.RegisterAttributesInteceptor.intercept(RegisterAttributesInteceptor.java:47)
	at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
	at org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:97)
	at org.vraptor.core.DefaultController.execute(DefaultController.java:46)
	at org.vraptor.http.DefaultDispatcher.dispatch(DefaultDispatcher.java:44)
	at org.vraptor.VRaptorServlet.service(VRaptorServlet.java:48)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
25/08/2009 10:25:55 org.apache.catalina.core.StandardContext reload
INFO: Reloading this Context has started
log4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.
25/08/2009 10:25:56 org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Desenvolvimento\java\workpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\sicp\WEB-INF\lib\servlet-api-2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
'25/08/2009 10:26:08 org.apache.catalina.core.StandardContext reload
INFO: Reloading this Context has started
log4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.
java.lang.NullPointerException
	at org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl.getBuiltInDV(Unknown Source)
	at org.apache.xerces.impl.dtd.XMLDTDValidator.init(Unknown Source)
	at org.apache.xerces.impl.dtd.XMLDTDValidator.reset(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.reset(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.dom4j.io.SAXReader.read(SAXReader.java:465)
	at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1518)
	at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:1035)
	at org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:64)
	at org.hibernate.cfg.Configuration.configure(Configuration.java:1462)
	at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1017)
	at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:64)
	at org.hibernate.cfg.Configuration.configure(Configuration.java:1448)
	at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1011)
	at br.com.faespsenar.utilities.HibernateUtil.<clinit>(HibernateUtil.java:110)
	at sun.misc.Unsafe.ensureClassInitialized(Native Method)
	at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(Unknown Source)
	at sun.reflect.ReflectionFactory.newFieldAccessor(Unknown Source)
	at java.lang.reflect.Field.acquireFieldAccessor(Unknown Source)
	at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
	at java.lang.reflect.Field.set(Unknown Source)
	at org.apache.catalina.loader.WebappClassLoader.clearReferences(WebappClassLoader.java:1644)
	at org.apache.catalina.loader.WebappClassLoader.stop(WebappClassLoader.java:1524)
	at org.apache.catalina.loader.WebappLoader.stop(WebappLoader.java:707)
	at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4611)
	at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3184)
	at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404)
	at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1309)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
	at java.lang.Thread.run(Unknown Source)
25/08/2009 10:26:09 org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Desenvolvimento\java\workpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\sicp\WEB-INF\lib\servlet-api-2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
25/08/2009 16:42:30 org.apache.catalina.core.StandardContext reload
INFO: Reloading this Context has started
log4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.
25/08/2009 16:42:31 org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Desenvolvimento\java\workpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\sicp\WEB-INF\lib\servlet-api-2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
R

up

R

Veja qual foi o SQL que foi disparado pelo Hibernate ativando o show_sql.
Pra fazer isso, vá no seu arquivo de configuração (se for xml) e coloque a linha:

<property name="show_sql">true</property>

Se for o de properties tb funciona (claro, sem as tags).

Depois posta ai o select que aparecer no console.

E

Você n precisa abrir 2 tópicos para o mesmo assunto , aguarde logo logo um usuário do fórum o respondera .

R

riccaio:
Veja qual foi o SQL que foi disparado pelo Hibernate ativando o show_sql.
Pra fazer isso, vá no seu arquivo de configuração (se for xml) e coloque a linha:

<property name="show_sql">true</property>

Se for o de properties tb funciona (claro, sem as tags).

Depois posta ai o select que aparecer no console.

Olha só que estranho cara! Não é que aparece uma vírgula no código SQL:


update
Projeto,
set
status=?
where
numeroDoGrupoModular=?
and numeroDoModulo>?
17:29:11,796 ERROR [JDBCExceptionReporter] ERROR: syntax error at or near ","

R

Talvez sua anotação na entidade esteja assim:

@Entity
@Table(name="Projeto,")
public class Projeto {
...
}

Repare na vírgula depois do nome da tabela.

R

riccaio:
Talvez sua anotação na entidade esteja assim:

@Entity
@Table(name="Projeto,")
public class Projeto {
...
}

Repare na vírgula depois do nome da tabela.

Está não cara! A minha anotação está normal, sem a vírgula!

R

Vc está usando xml ou anotações?

E faça um teste simples, uma consulta bem boba e veja qual select aparece. Algo assim:

Query query = session.createQuery("from Projeto where id < 1");
query.list();

Isso tb dá erro?

R

riccaio:
Vc está usando xml ou anotações?

E faça um teste simples, uma consulta bem boba e veja qual select aparece. Algo assim:

Query query = session.createQuery("from Projeto where id < 1");
query.list();

Isso tb dá erro?

Estou usando anotações!

L

Usa PreparedStatement e coloca alias (Produto p). O ‘from’ é opcional, mas convém colocar, pois quando tu colocas o From ele limita a só uma, então talvez ele não ponha a vírgula. Não testei aqui, mas acho que funciona.

Abraço!

UPDATE:
Em alguns sites em inglês o pessoal estava tentando resolver isso trocando o driver utilizado para conexão, mas nenhum apontou o resultado. E lembre-se, é claro, de usar o alias também nos itens da cláusula where - p.grupoModular, assim por diante).

(Desculpa se eu falo demais)

L

Opa, vi tuas msgs na outra thread. Tu tá usando Spring, por acaso, não?
Abraço!

R

leoramos:
Usa PreparedStatement e coloca alias (Produto p). O ‘from’ é opcional, mas convém colocar, pois quando tu colocas o From ele limita a só uma, então talvez ele não ponha a vírgula. Não testei aqui, mas acho que funciona.

Abraço!

UPDATE:
Em alguns sites em inglês o pessoal estava tentando resolver isso trocando o driver utilizado para conexão, mas nenhum apontou o resultado. E lembre-se, é claro, de usar o alias também nos itens da cláusula where - p.grupoModular, assim por diante).

(Desculpa se eu falo demais)

O erro está no Update que estou tentando fazer! Se não me engano, cláusulas FROM não são utilizados quando fazemos um UPDATE!?

R

leoramos:
Opa, vi tuas msgs na outra thread. Tu tá usando Spring, por acaso, não?
Abraço!

Não, estou usando vRaptor!

L

Sim, que não se usa eu sei, mas na verdade updates ‘puros’ nem são a cara do hibernate. Se tu colocar o from ele funciona também, na realidade… não está ‘errado’, digamos assim, peca-se pelo excesso (pelo menos foi isso que eu vi AGORA na documentação hehe).
O fato é que quando tu usa ‘from’ ele vai limitar a um tipo, então creio que ele não coloque a vírgula. Mas pelo que vi na outra thread, esses atributos nem são dessa classe, né?

L

Sendo bem sincero?
“Updates” e “Deletes” diretos não são muito a cara do Hibernate. É um dos casos que me faz não gostar muito dele, na verdade… nessas horas HQL é um atraso de vida.

Eu usaria nativeQuery, coice no peito mesmo. Perde-se algo de portabilidade (apesar de que nessa sintaxe aí, eu duvido muito), mas economiza dinheiro de aspirina.

R

leoramos:
Sim, que não se usa eu sei, mas na verdade updates ‘puros’ nem são a cara do hibernate. Se tu colocar o from ele funciona também, na realidade… não está ‘errado’, digamos assim, peca-se pelo excesso (pelo menos foi isso que eu vi AGORA na documentação hehe).
O fato é que quando tu usa ‘from’ ele vai limitar a um tipo, então creio que ele não coloque a vírgula. Mas pelo que vi na outra thread, esses atributos nem são dessa classe, né?

Vc têm algum exemplo aí com update usando from p/ postar?

Sim! Somente o atributo que será setado é da classe!!!

L

Cara, exemplo não tenho, mas coloca ele antes do nome da entidade, nada demais. Não lembro a versão da documentação que eu vi, eu tenho todas aqui e não vi qual eu abri o.0 mas não deve variar isso não… eu “acho”.

Com SQL nativa é mole… mas me diz, como estás acessando os outros atributos? Posta o teu mapeamento (as classes, no caso) pra gente conferir, ao que parece pelo respondido na outra thread, é algo a ser revisto.

R

leoramos:
Cara, exemplo não tenho, mas coloca ele antes do nome da entidade, nada demais. Não lembro a versão da documentação que eu vi, eu tenho todas aqui e não vi qual eu abri o.0 mas não deve variar isso não… eu "acho".

Com SQL nativa é mole… mas me diz, como estás acessando os outros atributos? Posta o teu mapeamento (as classes, no caso) pra gente conferir, ao que parece pelo respondido na outra thread, é algo a ser revisto.

Coloquei o "from" antes da entidade e continua dando erro!

O código ficou assim depois da alteração:

sql.append(" update from Projeto as proj set proj.status = :status ");
        sql.append(" where proj.acaoAtividadeDaRelacaoDeIntencao.numeroDoGrupoModular = :grupoModular ");
        sql.append(" and proj.acaoAtividadeDaRelacaoDeIntencao.acaoAtividade.numeroDoModulo > :numeroModulo ");
R

leoramos:
Sim, que não se usa eu sei, mas na verdade updates ‘puros’ nem são a cara do hibernate. Se tu colocar o from ele funciona também, na realidade… não está ‘errado’, digamos assim, peca-se pelo excesso (pelo menos foi isso que eu vi AGORA na documentação hehe).
O fato é que quando tu usa ‘from’ ele vai limitar a um tipo, então creio que ele não coloque a vírgula. Mas pelo que vi na outra thread, esses atributos nem são dessa classe, né?

Vc está dizendo que pode ser feito um select sem o from? Como ficaria? Eu acho que isso não é possível.
O que vc pode tirar é o select, e não o from. A não ser que vc esteja falando de um update, que pode ser feito com hql tb.

session.createQuery("update Produto p set p.nome='a' where id = 1").executeUpdate();

O select ficaria assim:

session.createQuery("from Produto p where p.id = 1").list();

Eu me esqueci de colocar o alias e depois usar ele no where.

L

riccaio:
leoramos:
Sim, que não se usa eu sei, mas na verdade updates ‘puros’ nem são a cara do hibernate. Se tu colocar o from ele funciona também, na realidade… não está ‘errado’, digamos assim, peca-se pelo excesso (pelo menos foi isso que eu vi AGORA na documentação hehe).
O fato é que quando tu usa ‘from’ ele vai limitar a um tipo, então creio que ele não coloque a vírgula. Mas pelo que vi na outra thread, esses atributos nem são dessa classe, né?

Vc está dizendo que pode ser feito um select sem o from? Como ficaria? Eu acho que isso não é possível.
O que vc pode tirar é o select, e não o from. A não ser que vc esteja falando de um update, que pode ser feito com hql tb.

session.createQuery("update Produto p set p.nome='a' where id = 1").executeUpdate();

O select ficaria assim:

session.createQuery("from Produto p where p.id = 1").list();

Eu me esqueci de colocar o alias e depois usar ele no where.

Não, não foi isso que eu quis dizer não… é que vi um lance sobre limitação de entidade usando ‘from’ para updates na documentação do maledeto do Hibernate, não tem nada a ver com select não.

Como eu falei, para o caso acima eu usaria SQL nativo.

R

Mas por que usar sql nativo pra um update? Eu não vejo vantagens. Eu prefiro usar o sql nativo quando for alguma coisa muito específica ou quando eu precisar de muita performance.

L

Dá uma olhada na documentação do hibernate sobre update em lote, o material é bem rico nesse sentido. A própria documentação assume que updates dessa forma pelo hibernate são mancos.

R

Eu não achei na documentação onde diz que update em lote são “mancos”.
Vc poderia me mandar o link de onde vc viu isso?

L

É um pdf, cara… e ‘manco’ foi maneira de dizer, né? hehe
Eu cato no meio desse monte de pdfs.

(mas sim, updates e deletes em lotes sequer são o foco do hibernate, isso já é sabido de longa data)

R

Eu sei que “manco” foi maneira de dizer. Por isso que eu coloquei entre aspas o que vc disse.

Cara, eu procurei na documentação e no google e não achei nada falando que as operações em batch são problemáticas.
Se vc achar o link ou alguma coisa dizendo, por favor mande ai.

L

Não é que são problemáticas, é só que não é o foco do Hibernate, então nada é 100% ‘correto’, digamos assim.
O que tem de melhor ou mais aceito é porquê virou padrão de fato, por uso. Manual do Hibernate tem isso, versão 3.
Abraço!

R

Como assim não é o foco do Hibernate. Isso tá na especificação.
Veja esse link, que fala sobre isso:
http://relation.to/Bloggers/BulkOperations

L

Dá uma lida exatamente no link que me passasse.
A especificação prevê update em lote para apenas uma classe (o que significa, por exemplo, que instruções update que necessitem selects em outra tabela na cláusula where já não funcionam).
Entendeu o que eu quis dizer que ‘não é o foco’? O update e delete no hibernate servem para alterar estados de uma entidade no banco. O que é feito em lote, inclusive, é muito menos eficiente (falando de velocidade) que fazer o SQL no braço.

R

Ainda não entendi o que vc quis dizer com não é o foco. O Hibernate implementa a JPA, uma especificação.
Quando vc diz que o “update e delete no hibernate servem para alterar estados de uma entidade no banco”, é isso mesmo que ele tem que fazer, alterar o banco.

E por que com HQL seria menos eficiente que SQL? O HQL gera SQL, normal.

L

Eu sei disso… mas acho que tu não pegou o conceito.

Alterar o estado da entidade NÃO É equivalente a alterar o banco.

O SQL que o Hibernate gera a partir da HQL nem sempre é igual ao SQL mais performático que terias. Sugiro que leias a especificação e a documentação do Hibernate, vai ficar mais clara a diferença pra ti. Não tá fluindo, pelo visto.

Abraço!

R

Em nenhum momento eu falei que alterar a base é a mesma coisa que alterar o estado lógico de objetos.
Eu falei que quando vc dispara um hql com uma operação em batch, ele tem que atualizar a base.
Eu concordo com vc que isso não irá alterar os estados dos objetos que o hibernate gerencia.

Eu tb sei que o sql que o Hibernate gera nem sempre é igual ao SQL mais performático, mas para operações de update e delete geralmente não vai ter muita diferença (não que eu saiba). Se fosse select eu concordaria com vc.

Eu leio sim a documentação e a especificação, e ainda acho que o que estou falando está correto.

Abraço.

Criado 25 de agosto de 2009
Ultima resposta 26 de ago. de 2009
Respostas 32
Participantes 4