JPA excepción consulta
Pregunta
Tengo una consulta edificado con EntityManager
:
Query q = em
.createQuery("SELECT * FROM :table WHERE username = :username AND password = MD5(:password)")
.setParameter("table", User.class.getName())
.setParameter("username", txtLogin.getText())
.setParameter("password", passPassword.getPassword())
;
User user = (User) q.getSingleResult();
pero me da una excepción:
Excepción en hilo "AWT-EventQueue-0" java.lang.IllegalArgumentException: Un excepción al crear una consulta en EntityManager:
Excepción Descripción: Error de sintaxis al analizar el consulta [SELECT *: tabla WHERE Nombre de usuario =: nombre de usuario y contraseña = MD5 (: contraseña)], la línea 1, columna 7: símbolo inesperado [*].
¿Cómo solucionarlo?
Es imposible el uso de *
en las consultas?
Solución
sintaxis JPQL es diferente de SQL, hacer
Select T from Thingy T
en lugar de
Select * from Thingy
Pero eso es sólo una parte de su problema. SELECT t FROM :table t
tampoco funcionará, como parámetros no están permitidos en la cláusula from
, pero sólo en la cláusula where
. Por lo que debe hacer algo como esto:
Query q = em
.createQuery("SELECT u FROM " + User.class.getName()
+ "u WHERE username = :username AND password = MD5(:password)")
.setParameter("username", txtLogin.getText())
.setParameter("password", passPassword.getPassword())
;
Además, no hay ninguna función en MD5()
JPQL, por lo que utilizar MD5 que o bien tienen que hacerlo en código Java o utilizar una consulta SQL nativo.
Otros consejos
Si no se puede utilizar *
así.
Esto es cómo hacerlo. Nota incluso el SELECT es opcional
Query q = em
.createQuery("FROM " + User.class.getName() + " WHERE username = :username AND password = MD5(:password)")
.setParameter("username", txtLogin.getText())
.setParameter("password", passPassword.getPassword())
;
User user = (User) q.getSingleResult();
Con Elegir puede hacer como esto:
Query q = em
.createQuery("SELECT us FROM " + User.class.getName() + "us WHERE username = :username AND password = MD5(:password)")
.setParameter("username", txtLogin.getText())
.setParameter("password", passPassword.getPassword())
;