2012-04-18 68 views
1

我是新来的这个。请帮帮我。我不能在冬眠hql查询中的两个表之间进行内部联接

我内心的加入看起来像这样: 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) 

回答

3

在HQL,您使用的实体,而不是表。实体通过关联(OneToOne,OneToMany等)链接在一起。连接可以在关联实体之间完成。

例如,如果您有产品和供应商之间的多对一的关联,HQL查询是:

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

ON子句是不必要的,因为Hibernate从多对一关联的映射,一个产品是知道与使用provider.id_provider主键的product.id_provider外键的提供程序相关联。

所有这些在Hibernate documentation中都有很好的解释。

+0

我不明白你为什么在HQL查询中写了p.provider,为什么你写了那个p?对不起,我是初学者,在理解这方面我有一些小问题。 – alin 2012-04-19 20:38:40

+0

例如,我想打印实体产品中的所有列,并且当我尝试使用来自Product的查询时,实体中外键的列不显示它们包含的信息。它似乎sakila.entity.HistoryProduct \t sakila.entity.Provider \t sakila.entity.Category而不是值。请给我一些建议。万分感谢! – alin 2012-04-19 21:03:08

+0

我没有你的代码,我没有魔术水晶球,所以我不可能评论它。但我认为你只是错过了Hibernate的一大部分:实体之间的关联。阅读文档。我写了p.provider,因为产品有一个提供者。在Java中,我会调用'p.getProvider()'。在HQL中,我编写了p.provider。 – 2012-04-21 06:27:49

0

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