Pregunta

Estoy usando hibernación.Escribí alguna consulta nativa porque necesito usar la declaración Sub SELECT.

consulta se ve así:

SELECT sub.rownum FROM 
    (SELECT k.`news_master_id` AS id, @row := @row + 1 AS rownum 
        FROM keyword_news_list k 
        JOIN (SELECT @row := 0) r 
        WHERE k.`keyword_news_id` = :kid
    ORDER BY k.`news_master_id` ASC) AS sub 
WHERE sub.id  = :nid

Cuando ejecuto esta consulta como esta:

sessionFactory.getCurrentSession()
    .createSQLQuery(query)
    .setParameter("kid", kid)
    .setParameter("nid", nid)
    .uniqueResult();

Esta excepción sale:

org.hibernate.QueryException: Space is not allowed after parameter prefix ':' ....

Esto podría debido al operador de :=.Encontré un poco Número de hibernación sobre esto.Este problema sigue abierto.¿No hay ninguna solución para este problema?

¿Fue útil?

Solución

Puede implementar esto es una forma ligeramente diferente ... Debe reemplazar el operador: Operador con otra cosa (Diga '|' Char) y en su interceptor Reemplace el '|'con el :.

De esta manera, Hibernate no intentará pensar: es un param, pero lo ignorará

Para la lógica de interceptor puede consultar el hibernaciónmanual

Esto ha funcionado para mí usando MySQL 5.

Recuerde, este reemplazo de: solo debe hacerse a ':=' y otros requisitos específicos de MySQL .. No intente reemplazar el: para los parámetros.(Hibernate no podrá identificar los parámetros entonces)

Otros consejos

Tenga en cuenta que HHH-2697 ahora está arreglado para Hibernate 4.1.3 y probado en Hibernate 4.3.8.Final;Tienes que escapar con Backslash:

SELECT k.`news_master_id` AS id, @row \:= @row + 1 AS rownum 
    FROM keyword_news_list k 
    JOIN (SELECT @row \:= 0) r 
    WHERE k.`keyword_news_id` = :kid
ORDER BY k.`news_master_id` ASC

Otra solución para aquellos de nosotros que no podemos hacer el salto a hibernar 4.1.3.
Simplemente use /*'*/:=/*'*/ dentro de la consulta.El código de hibernación trata todo entre ' como una cadena (lo ignora).MySQL, por otro lado, ignorará todo dentro de un bloque de bloques y evaluará toda la expresión a un operador de asignación.
Sé que es rápido y sucio, pero se hace el trabajo sin procedimientos almacenados, interceptores, etc.

Prefiero incluir la primavera JDBC y ejecutar la consulta en lugar de luchar contra los interceptores de hibernación.

en Hibernate Exception On Encountering MySQL:= Operador Stanislav le dio otra opción que no sea el interceptor para resolver este problema

Supongo que no debe haber un espacio después=, el operador debe escribirse como=: (sin espacios)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top