2011-01-19 15 views
6

hay una manera simple de manejar la inyección SQL en Hibernate HQL orden por cláusula. Los parámetros nombrados obviamente no funcionan para eso.Manejar la inyección SQL en orden HQL por la cláusula

EDIT:

No dude en enviar su manera de manejar este problema. Quiero ver las soluciones de otras personas y enseñar de ellas.

Gracias por cualquier sugerencia y solución.

+0

¿Por qué no utilizar nhibernate con linq? – Dave

+0

@Dave Hola, estoy usando Java, por lo que linq no es accesible para mí. –

+0

¡Debería haber recogido eso rom hibernate, en lugar de nHibernate! Buena suerte resolviendo esto. – Dave

Respuesta

3

Puede utilizar la API de criterios de Hibernate en lugar de HQL.

La API de criterios verifica que la orden criterium se refiere a una propiedad válida.

si intenta calle detrás de esa manera:

public void testInjection() { 
    String orderBy = "this_.type desc, type"; 

    Criteria crit = this.getSession().createCriteria(DemoEntity.class); 
    crit.addOrder(Order.asc(orderBy));  
    crit.list(); 
} 

obtendrá una QueryException: "could not resolve property this_ of de.test.DemoEntity" lanzada por AbstractPropertyMapping.

+0

Hola, gracias por responder, pero estoy trabajando en la ejecución del proyecto, donde no puedo cambiar a la API de criterios. Así que estoy buscando exactamente lo que apunta, pero en HQL. –

0

Hibernate usa PreparedStatement que ya protege contra la inyección de SQL. En un PreparedStatment, los argumentos están vinculados a la declaración en lugar de tener una instrucción SQL de texto sin formato emitida. No debería tener que preocuparse por la inyección SQL cuando usa hibernate.

Aquí hay un hilo que asegura que la hibernación está a salvo de la inyección SQL Click Here.

+0

Sí, eso es cierto, pero si usa setParameter en PreparedStatment SQL se ve como <... ordenar por 'nombre' ...> y el resultado no está ordenado, porque debería verse como <... ordenar por nombre ... .>. Estoy buscando una manera simple de evitar administrar alguna tabla de campos permitidos. –

1

Terminé con una solución que quería evitar. Implementé un mapa donde la clave es lo que el usuario ve en la URL y el valor es columna (s) en DB que está después de la cláusula ORDER BY.

Cuestiones relacionadas