我有一个使用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();
但我得到一个例外:
线程“AWT-EventQueue-0”中的异常 java.lang.IllegalArgumentException:An 创建时发生异常 在EntityManager中查询:
例外 描述:语法错误解析 query [SELECT * FROM:table WHERE username =:username AND password = MD5(:密码)],第1行,第7列: 意外的令牌[*]。
如何解决?
是否无法在查询中使用*
?
答案 0 :(得分:7)
JPQL语法与SQL不同,你做
Select T from Thingy T
而不是
Select * from Thingy
但这只是你问题的一部分。 SELECT t FROM :table t
也不起作用,因为from
子句中不允许使用参数,但仅在where
子句中。所以你必须这样做:
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())
;
此外,JPQL中没有MD5()
函数,因此要使用MD5,您必须在java代码中执行此操作或使用本机SQL查询。
答案 1 :(得分:0)
是的,你不能那样使用*
。
这是怎么做的。请注意,即使SELECT是可选的
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();
使用SELECT,你可以这样做:
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())
;