【问题标题】:I can't make a inner join between two tables in hibernate hql query我无法在休眠 hql 查询中的两个表之间进行内部连接
【发布时间】:2012-04-30 06:43:00
【问题描述】:

我是新手。请帮帮我。

我的内部连接如下所示: select p.idprodus, p.denumire, p.cantitate from Produs p inner join Furnizor f on p.idfurn = f.idfurn

我想在 idfurn 列上进行内部连接,但出现以下错误:

org.hibernate.QueryException: 外连接或全连接后必须跟路径表达式select p.idprodus, p.denumire, p.cantitate from sakila.entity.Produs p inner join Furnizor f on p.idfurn = f.idfurn

at org.hibernate.hql.classic.FromParser.token(FromParser.java:170)
at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86)
at org.hibernate.hql.classic.PreprocessingParser.token(PreprocessingParser.java:108)
at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:28)
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:216)
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:185)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)

【问题讨论】:

    标签: sql hibernate hql


    【解决方案1】:

    如果不存在关联(例如 OneToMany 映射)并且您需要内部联接,则使用旧的 cross join notation

    【讨论】:

      【解决方案2】:

      在 HQL 中,您使用实体,而不是表。实体通过关联(OneToOne、OneToMany 等)链接在一起。关联实体之间只能进行连接。

      例如,如果您在 Product 和 Provider 之间有 ManyToOne 关联,则 HQL 查询为:

      select p from Product p inner join p.provider provider where ...
      

      on 子句是不必要的,因为 Hibernate 从 ManyToOne 关联的映射中知道 Product 使用 product.id_provider 外键到 provider.id_provider 主键与其提供者相关联。

      Hibernate documentation 中对所有这些都进行了很好的解释,并附有大量示例。

      【讨论】:

      • 我不明白你为什么在Hql查询中写p.provider,你为什么写那个p?抱歉,我是初学者,在理解这一点上有一些小问题。
      • 例如,我想打印实体 Product 中的所有列,当我尝试使用 Product 中的查询时,该实体中的外键列不显示信息,它们包含。它出现 sakila.entity.HistoryProduct sakila.entity.Provider sakila.entity.Category 而不是值。请给我一些建议。非常感谢!
      • 我没有你的代码,也没有魔法水晶球,所以无法评论。但我认为您只是错过了 Hibernate 的很大一部分:实体之间的关联。阅读文档。我写 p.provider 是因为一个产品有一个提供者。在 Java 中,我会调用 p.getProvider()。在 HQL 中,我写的是 p.provider。
      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2013-09-25
      • 2013-01-19
      相关资源
      最近更新 更多