subconsultas parametros inner injection example ejemplos datos consultas consultar consulta con java hibernate orm jpa

parametros - sql injection java example



Hibernate genera una consulta SQL no vĂ¡lida con MySQL (3)

Otra situación en la que podría tener esta excepción es cuando tiene palabras reservadas como columnas para la tabla. Por ejemplo, ''to'' y ''from'' no son nombres de clúster adecuados para MySQL. Obviamente, se trata de una falla en Hibernate, que no verifica tales columnas y, además, continúa funcionando sin errores, incluso si la tabla no se crea.

Tengo las siguientes clases de entidad JPA (caso de ejemplo). Una casa pertenece a una sola calle. Una calle tiene muchas casas.

@Entity public class House { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Integer id; public String name @ManyToOne public Street street; } @Entity public class Street { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Integer id; @OneToMany(mappedBy="street") public Set<House> houses; }

Tengo el tipo de generación configurado en identidad, que se supone que asigna automáticamente una nueva ID.

Al crear una nueva casa con una nueva calle, primero tengo que crear y conservar Street, seguido de House. Esto se debe a que no tengo CascadeType configurado para PERSIST, por lo que debe hacerse manualmente [1]. Sin embargo, al insertar una calle recién creada:

Street street = new Street(); entityManager.persist(street);

Hibernate / JPA genera la siguiente consulta SQL:

insert into Street default values

que MySQL no le gusta

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''default values'' at line 1

¿Alguna idea de por qué? Estoy usando Java 6, MySQL 5.0.67 con la implementación de JPA de Hibernate (versión 3.2.1.ga).

[1] EJB 3 en acción páginas 318-319


Standard SQL especifica esta sintaxis opcional para INSERT :

INSERT INTO <Table Name> DEFAULT VALUES

Esta es la sintaxis SQL legal, soportada, por ejemplo, por Microsoft SQL Server , PostgreSQL y SQLite , pero no por Oracle, IBM DB2 o MySQL.

MySQL admite otra sintaxis que logra el mismo resultado:

INSERT INTO <Table Name> () VALUES () INSERT INTO <Table Name> (col1, col2, col3) VALUES (DEFAULT, DEFAULT, DEFAULT)

En Hibernate, debe configurar el dialecto de SQL correctamente, y le corresponde a Hibernate generar un SQL válido para la marca de RDBMS de destino.

import org.hibernate.cfg.Configuration; Configuration cfg = new Configuration(); cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");

También puede especificar propiedades colocando un archivo llamado hibernate.properties en un directorio raíz de classpath.


Si no tiene un error en su declaración de SQL, entonces puede verificar el nombre de columna de la tabla, ya que puede contener un nombre predefinido que Mysql utiliza; por ejemplo, ''columna'' que no puede usarse como una columna nombre de la tabla