【问题标题】:Hibernate - Path expected for join休眠 - 预期加入的路径
【发布时间】:2018-11-12 20:18:44
【问题描述】:

我有一个这样的休眠查询

SELECT t FROM User t JOIN UserRole u ON t.username = u.username WHERE t.username=:username AND t.password =:pass AND u.userRole =:ust

但是这个查询不起作用 错误

错误:需要加入的路径! 错误:预期加入的路径! 预计加入的路径! 在 org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:385) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3903) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3689) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList (HqlSqlBaseWalker.java:3567) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:708) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:564) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:131) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:93) 在 org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167) 在 org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) 在 org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) 在 org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836) 在 com.nepitc.mshandloomfrabics.daoimp.UserDAOImp.login(UserDAOImp.java:40) 在 com.nepitc.mshandloomfrabics.service.UserService.login(UserService.java:74) 在 com.nepitc.mshandloomfrabics.controller.AuthorizationController.login(AuthorizationController.java:38)

如何正确书写

【问题讨论】:

  • 您的连接语法已关闭,一方面,可能会导致您立即面临错误。对于这个和其他错误,请阅读官方文档:docs.jboss.org/hibernate/orm/3.3/reference/en/html/…
  • @TimBiegeleisen 虽然其中大部分内容在一段时间内没有改变,但与 10 年前的旧 3.3 版本相比,链接到更新的文档可能更合适。
  • 请同时包含两个实体的完整错误和实体映射。

标签: hibernate


【解决方案1】:

在 JPQL / HQL 中,您不需要为连接指定 ON 子句,因为 Hibernate 已经知道两个实体之间的映射以及生成所述连接所需的列。

所以你真的只需要提供谓词和请求来执行连接,如下所示

SELECT u FROM User u 
  JOIN u.roles ur
 WHERE u.username = :username
   AND u.password = :password
   AND ur.userRole = :role

【讨论】:

  • Hibernate 是如何知道使用 username 列而不是其他列来加入的?
  • @TimBiegeleisen 我只是假设两个实体可能通过某种关联相关联,因此无论这两个实体与哪些列关联,都无需在该上下文中指定连接条件。但似乎实体映射将讲述如何在提供查询时最好地编写查询。
  • 好的,让我添加这两个实体之间的映射。
猜你喜欢
  • 2013-04-27
  • 2011-08-11
  • 1970-01-01
  • 2011-04-24
  • 2020-05-02
  • 1970-01-01
  • 2012-02-08
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多