2012-02-27 14 views
16

Estoy usando Hibernate. Escribí alguna consulta nativa porque necesito usar una declaración secundaria.¿Cómo puedo usar el operador de asignación de MySQL (: =) en la consulta nativa de hibernación?

de consulta es el siguiente:

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 ':' .... 

Esta fuerza debido := operador. Encontré algunos Hibernate issue sobre esto. Este problema aún está abierto. ¿No hay alguna solución para este problema?

+0

¿Hay alguna cosa que puede ayuda desde aquí? http://dev.mysql.com/doc/refman/5.0/en/assignment-operators.html#operator_assign-value – ManuPK

+0

@ManuPK Gracias, pero no ayudó. Creo que no hay solución para mi pregunta. Encontré una pregunta similar con la mía http://stackoverflow.com/questions/2712240/how-to-use-mysql-variables-with-hibernate pero no hay una buena solución. –

Respuesta

5

se puede implementar esta es una manera ligeramente diferente .. es necesario sustituir el: operador con algo más (digamos '|' char) y en su interceptor reemplazar el '|' con el : .

este modo de hibernación no se trata de pensar en el: es un parámetro, pero lo ignorará

Para la lógica interceptor puede hacer referencia a la hibernate manual

Esto ha funcionado para mí el uso de MySQL 5.

recuerde, esta sustitución de: debe hacerse únicamente a ': =' 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)

+0

¡Bien! Lo intentaré. –

+4

¿CÓMO ES ESTÚPIDO HIBERNATE HUH? Puedo imaginarme el codificador funcionando. Nah, ¿cómo podría NUNCA haber dos puntos en el SQL? ¡Ninguna posibilidad!¡Hagamos que no haya un mecanismo de escape! – droope

+1

Lo siento, estaba un poco enojado por tener que trabajar. La solución anterior solo es si solo tienes un martillo. También puede usar \: para escapar de los dos puntos, aunque en mi caso, rompió todos los parámetros nombrados (simplemente dejaron de funcionar). – droope

-5

supongo que no debería haber un espacio después de =, el operador debe escribirse como =: (sin espacios)

+0

Lo intenté, pero no está funcionando. –

24

Tenga en cuenta que HHH-2697 ahora se ha corregido para Hibernate 4.1.3 y probado en Hibernate 4.3.8.Final; Usted tiene 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 
+3

usando ** Hibernate 4.3.7 solo una barra invertida es suficiente **, p. Pregunta de PG 9.3 'select f (p_tst \: = 1)' (donde puede haber dos en las cadenas de Java para escapar de ellos) –

0

que prefieren incluir la primavera JDBC y ejecutar la consulta en lugar de luchar contra los interceptores de Hibernate.

14

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 Hibernate trata todo entre ' como una cadena (lo ignora). MySQL, por otro lado, ignorará todo dentro de una blockquote y evaluará toda la expresión a un operador de asignación.
Sé que es rápido y sucio, pero entiendo es el trabajo sin procedimientos almacenados, interceptores etc.

+0

Genial, me funciona. –

Cuestiones relacionadas