tipos relacionales operadores lógicos logicos ejemplos datos comparacion booleanos asignacion aritméticos aritmeticos java mysql hibernate nativequery

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



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)