2010-09-14 12 views
9

escribo este post para saber si alguien sabe cómo hacer esto:Hibernate - Personalizar inserción en la base de datos

que quiero hacer esta inserción:

INSERT INTO TABLA (CAMPO1, CAMPO2) VALUES (?, crypt(?,'cdp')) 

cripta es una función almacenada en mi base de datos y la inserción Me gustaría hacerlo en mi código. En realidad, cuando quiero insertar algo en la base de datos que utilizo:

getHibernateTemplate().persist(obj); 

Pero quiero hacer una inserción "a medida", porque necesito usar esa función.

estoy usando Hibernate + anotaciones:

@org.hibernate.annotations.SQLInsert (sql = "INSERT INTO TABLA (CAMPO1, CAMPO2) VALUES (?, crypt(?,'cdp'))") 

Pero la clave 'CDP' debe ser leida desde un archivo, por lo que esta solución no funciona para mí.

Quiero usar un método en mi código para ejecutar una consulta SQL (consulta INSERT)

+0

¿Es esto factible usar SQL sin formato (en otras palabras, dejemos Hibernate a un lado)? En caso afirmativo, no entiendo por qué el '@ SQLInsert' no funciona para usted. Si no, me temo que Hibernate no ayudará. ¿Puedes aclarar? –

+0

No funciona para mí porque necesito obtener un String con la clave de cifrado, por lo que no sé cómo presentarlo en el @SQLInsert – Michel

Respuesta

15

he aquí una solución:

Query query = getSession().createSQLQuery("INSERT INTO TABLA (CAMPO1, CAMPO2) VALUES (:valor1, encripta(:valor2, :key))"); 
query.setParameter("valor1", valor1); 
query.setParameter("valor2", valor2); 
query.setParameter("key", key); 
query.executeUpdate(); 
+7

, no debería estar en el hábito de hacer cadenas anexadas a sus sentencias SQL. Es mejor usar parámetros con nombre. –

+1

@NathanFeger su punto es lo suficientemente importante que he editado esta respuesta para incorporarlo –

+0

¿Hay una manera de conseguir las llaves generar [como en JDBC] (http://stackoverflow.com/a/4224729/1652461)? – remi

18

como Nathan Feger mencionó, los parámetros con nombre son mucho más limpio y más seguro. En este caso, la instrucción se puede ejecutar con el siguiente código:

Query query = getSession().createSQLQuery("INSERT INTO TABLA (CAMPO1, CAMPO2) VALUES (:valor1, encripta(:valor2, :key))"); 
query.setParameter("valor1", valor1); 
query.setParameter("valor2", valor2); 
query.setParameter("key", key); 
query.executeUpdate(); 
+0

Editado la respuesta de Michel para incorporar su código. –

Cuestiones relacionadas