【问题标题】:Syntax error in HQL Query "unexpected token"HQL 查询“意外令牌”中的语法错误
【发布时间】:2018-02-20 17:50:39
【问题描述】:

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

得到错误:

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

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

供您参考的代码:

Session session = SessionUtil.getSession();

Query query = session.createQuery("SELECT 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);
List<Login> logins = query.list();
session.close();
return logins;

【问题讨论】:

  • 你可以分享完整的错误@mree
  • org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:(在第 1 行附近,第 44 列 [SELECT a.mobile, a.email, p.patientId FROM (SELECT l.LoginId, l.email, l.mobile 来自 com.innovellent.hibernate.restapi.model.Login l where email= :email and password= :password) a INNER JOIN com.innovellent.hibernate.restapi.model.PatientProfile p ON a.loginId = p.loginId]

标签: java sql hibernate jpql


【解决方案1】:

我想改用本机查询,因为 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了解更多信息

Subqueries 可以用在WHEREHAVING 子句中。

【讨论】:

    【解决方案2】:

    请注意,HQL 子查询只能出现在 select 或 where 子句中。

    因此您可以使用 nativeQuery,但我建议尽可能使用 HQL 以避免数据库可移植性的麻烦,并利用 Hibernate 的 SQL 生成和缓存策略。 代替原生查询,您可以使用 join 方法并链接它们。

    注意 HQL 与持久对象及其属性一起使用。HQL 查询由 Hibernate 转换为常规 SQL 查询,进而对数据库执行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多