lógicos - operadores relacionales en java
¿Cómo puedo usar el operador de asignación de MySQL(:=) en la consulta nativa de hibernación? (6)
Estoy usando Hibernate. Escribí alguna consulta nativa porque necesito usar una declaración de selección secundaria.
La 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 deberse a :=
operador. Encontré un problema de Hibernate sobre esto. Este problema sigue abierto. ¿No hay alguna solución para este problema?
Otra solución para aquellos de nosotros que no podemos dar el salto a Hibernate 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 lo que está dentro de un blockquote y evaluará la expresión completa 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 Spring JDBC y ejecutar la consulta en lugar de luchar contra los interceptores de Hibernate.
Supongo que no debería haber un espacio después de =, el operador debería escribirse como =: (sin espacios)
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 barra invertida:
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
en la excepción de Hibernate al encontrar mysql: = el operador Stanislav dio otra opción que no sea un interceptor para resolver este problema
puede implementar esto es una forma ligeramente diferente ... necesita reemplazar el operador: con otra cosa (diga ''|'' char) y en su interceptor reemplazar el ''|'' con el : .
De esta manera, hibernar no intentará pensar que: es un parámetro, pero lo ignorará.
Para la lógica del interceptor puede consultar el manual de hibernación
Esto me ha funcionado usando MySQL 5.
recuerde, este reemplazo de: debe hacerse solo para '': ='' y otros requisitos específicos de MySQL .. no intente reemplazar el: para los marcadores de posición param. (hibernate no podrá identificar los parámetros entonces)