【问题标题】:org.hibernate.hql.internal.ast.QuerySyntaxException:org.hibernate.hql.internal.ast.QuerySyntaxException:
【发布时间】:2017-09-12 20:05:02
【问题描述】:

我在 hql 中使用选择查询。但我不能在我的 API 中使用。

得到错误

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token:

谁能告诉我是我的 HQL 中的错误

我的代码

Session session = SessionUtil.getSession();
//Query query = session.createQuery("from Login where email='" + email + "' and password='" + password + "'");
Query query = session.createQuery("SELECT CONCAT(p.FIRSTNAME, ' ', p.LASTNAME) as Name, a.mobile,  a.email, p.patientId\n"
        + "FROM ( from login where email= '\" + email + \"' and password= '\" + password + \"') a\n"
        + " INNER JOIN\n"
        + " patientprofile p ON a.loginId= p.loginId");
List<Login> logins = query.list();

session.close();
return logins;

【问题讨论】:

  • 您正在使用两个同名变量query!你有什么问题?
  • 首先,您不能调用具有相同值的 2 个变量,您要列出的查询是哪个?您知道哪个是错误的吗?
  • 没有第一个被注释掉..
  • 您可能想在内括号中,在 FROM 之间添加一个选择。
  • 这看起来不像是有效的 HQL 语法,请检查 docs.jboss.org/hibernate/orm/5.2/userguide/html_single/…

标签: java sql hibernate


【解决方案1】:

首先:\n 在查询中未被接受,因此您必须删除它们。

Query query = session.createQuery("SELECT CONCAT(p.FIRSTNAME, ' ', p.LASTNAME) as Name, a.mobile,  a.email, p.patientId "
        + "FROM ( from login where email= '" + email + "' and password= '" + password + "') a "
        + " INNER JOIN "
        + " patientprofile p ON a.loginId= p.loginId");

第二:连接不安全,您可以使用setParameter 来避免语法错误和 SQL 注入:

Query query = session.createQuery("SELECT CONCAT(p.FIRSTNAME, ' ', p.LASTNAME) as Name,"
        + "a.mobile, a.email, p.patientId "
        + "FROM ( from login where email= :email and password= :password) a "
        //----------------------------------^----------------------^
        + "INNER JOIN "
        + "patientprofile p ON a.loginId= p.loginId");
query.setParameter("email", email);
query.setParameter("password", password);

第三:我真的不明白这部分查询( from login where email= :email and password= :password) 这可能会造成另一个问题,请确保您使用的是正确的查询!可以是:

Query query = session.createQuery("SELECT CONCAT(p.FIRSTNAME, ' ', p.LASTNAME) as Name,"
            + "a.mobile, a.email, p.patientId "
            + "FROM (SELECT l from login l where email= :email and password= :password) a "
            //---------------^-----------^
            + "INNER JOIN "
            + "patientprofile p ON a.loginId= p.loginId");
    query.setParameter("email", email);
    query.setParameter("password", password);

Forth:我想改用原生查询,因为 HQL 和 JPQL 都只在 SELECT、WHERE 或 HAVING 子句中接受 子查询,因此您可以使用:

Query query = session.createNativeQuery("SELECT a.mobile, a.email, p.patientId FROM "
        + "(SELECT * from login l where email= :email and password= :password) a "
        + "INNER JOIN patientprofile p ON a.loginId= p.loginId");
query.setParameter("email", email);
query.setParameter("password", password);

JPQL documentation了解更多信息

【讨论】:

  • java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: 意外令牌: (在第 1 行附近,第 90 列 [SELECT CONCAT(p.FIRSTNAME, ' ', p.LASTNAME ) as Name, a.mobile, a.email, p.patientId FROM (SELECT l.loginId, l.email, l.mobile from login l where email= :email and password= :password) a INNER JOIN patientprofile p ON a .loginId= p.loginId]
  • @mree 您的查询中的p 在哪里?您的意思是将 p 更改为 a 吗?
  • java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: 意外令牌: (在第 1 行附近,第 90 列 [SELECT CONCAT(p.FIRSTNAME, ' ', p.LASTNAME ) as Name, a.mobile, a.email, p.patientId FROM (SELECT l.loginId, l.email, l.mobile from login l where email= :email and password= :password) a INNER JOIN patientprofile p ON a .loginId= p.loginId]
  • 有人可以帮我解决这个问题吗?帮帮我
  • 你必须问自己一个问题,你的查询应该做什么@mree?
猜你喜欢
  • 1970-01-01
  • 2014-03-25
  • 2016-06-08
  • 2018-08-11
  • 2016-12-24
  • 1970-01-01
  • 2020-03-13
  • 2016-03-23
  • 2016-07-12
相关资源
最近更新 更多