HQL查询中的语法错误"意外令牌"

时间:2017-09-12 10:00:30

标签: java sql hibernate jpql

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

将错误视为:

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

有人能告诉我wat是My 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;

2 个答案:

答案 0 :(得分: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子句中使用。

答案 1 :(得分:1)

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

所以你可以使用nativeQuery,但我建议尽可能使用HQL来避免数据库可移植性的麻烦,并利用Hibernate的SQL生成和缓存策略。 而不是本机查询,您可以使用连接方法并链接它们。

注意HQL适用于持久对象及其属性 .HQL查询由Hibernate转换为传统的SQL查询,后者又对数据库执行操作。