¿Cómo puedo usar el operador Asignar MySQL (:=) en Hibernate Native Query?
-
13-11-2019 - |
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?
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)