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?

¿Fue útil?

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())
    ;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top