[RESOLVIDO]Erro no deploy de NamedQuery com 'GROUP BY x DESC'

7 respostas
C

Boa tarde.

Criei uma namedquery, veja abaixo, mas qdo tento fazer o deploy do projeto dá erro. Meu ‘select’ roda tranquilamente no meu MySQL 5.1.47

@NamedQuery(name = "Movimentacao.findAll", query = "SELECT m FROM movimentacao m WHERE m.expediente.status = '1' GROUP BY m.expediente.id DESC ORDER BY m.id DESC")

mas quando vou fazer o deploy do projeto dá erro.

Se tiro 'DESC’endente do ‘GROUP BY’ a namedquery ñ acusa problema.

Alguém sabe me dizer oq fazer para corrigir este erro?

Muito obrigado.
[]'s
t++

7 Respostas

robertol

A cláusula GROUP BY não possui o DESC atrelado a ela. Exclua o DESC e sua query funcionará perfeitamente.

C

Valeu pela resposta. :slight_smile:

A namedquery já funciona sem o ‘desc’ do ‘group by’ e o comando funciona perfeitamente no MySQL.

Existe a clásula “group by x desc” no dicionário do MySQL. Veja em http://dev.mysql.com/doc/refman/5.0/en/select.html

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name' export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

Alguma outra idéia? Como tem pouco conheciment, será q é alguma restrião do Hibernate?

Muito obrigado.
[]'s
t++

robertol

Bom, então o MySQL deve ser o único (ou um dos poucos) que aceitam o DESC no group by.

Dê uma olhada em: http://www.w3schools.com/sql/sql_groupby.asp e http://msdn.microsoft.com/pt-br/library/ms177673.aspx

Nem sempre o que funciona em seu SGBD irá funcionar no Hibernate, pois o Hibernate utiliza o SQL Padrão e o seu SGBD poderá acrescentar algo mais.

C

Valeu pela resposta robertol.

Não tinha certeza se era alguma restrição do Hibernate, muito obrigado pela confrimação. :slight_smile:

Por acaso vc tem alguma sugestão de solução simplificada para este “problema”?

Como a namedquery retorna uma lista de objetos ‘movimentacao’ sendo um dos membros um outro objeto, ‘expediente’ acho q resolver com ‘selects’ e ‘fors’ ñ tão eficiente.

Ah, jurava q o MySQL seguia o padrão W3C. :shock:

Muito obrigado.
[]'s
t++

robertol

Charles,

Não vejo sentido no uso do group by na sua query. Seria mais eficiente que você colocasse a cláusula do group by como sendo a primeira cláusula do order by.

:wink:

C

robertol:
Charles,

Não vejo sentido no uso do group by na sua query. Seria mais eficiente que você colocasse a cláusula do group by como sendo a primeira cláusula do order by.

;)

O relacionamento entre a tabela expediente-movimento é 1-m e num determinado momento preciso de uma seleção contendo somente o último registro de movimento de cada expediente.

Se utilizo só ‘GROUP BY m.expediente’ ele pega o primeiro registro cadastrado daquele grupo, assim, o ‘GROUP BY m.expediente DESC’ me garante o último cadastrado.

Entendeu?

[]'s
t++

C

Baum, valeu pela ajuda e esclarecimento robertol =D

Como ñ deu pra fazer a namedquery como fazia diretamente no MySQL acabei usando a dica do linhadecodigo.

Muito obrigado.
[]'s
t+

Obs: editado para correções de link.

Criado 31 de outubro de 2011
Ultima resposta 1 de nov. de 2011
Respostas 7
Participantes 2