HQL错误:with-clause引用了两个不同的从句元素 [英] HQL error: with-clause referenced two different from-clause elements

查看:158
本文介绍了HQL错误:with-clause引用了两个不同的从句元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


$ b $我开始使用Hibernate,我使用HQL,使用一些连接从数据库检索数据,但得到这个错误,任何关于如何解决这个问题的帮助表示赞赏。 b

Field.hbm.xml文件:

 < id name =idtype =string> 
< column name =field_map_cd/>
< generator class =assigned>< / generator>
< / id>

Rule.hbm.xml档案:

 < many-to-one name =src_field_mapcolumn =field_map_cdnot-null =trueinsert =falseupdate =false/> 

HQL查询:

 选择t.id,t.name,t.src_field_map.id,s1.field_map_nm如src_field_map_nm,
t.tgt_field_map.id,s2.field_map_nm从规则为t
tgt_field_map_nm左连接t.src_field_map作为s1左连接t.tgt_field_map作为s2
(s1.id = t.src_field_map.id和s2.id = t.tgt_field_map.id)

Stacktrace:

 错误:with-clause引用了两个不同的从句子元素
with-clause引用了两个不同于从句的元素
at org.hibernate.hql.internal.ast.HqlSqlWalker.handleWithFragment(HqlSqlWalker.java:465)
在org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:413)
在org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3858)
在org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3644)
位于org.hibernate.hql.internal.antlr.Hql SqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3522)
处org.hibernate.hql.internal.antlr org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
。 HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)
处org.hibernate.hql.internal.antlr org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
。 HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
处org.hibernate.hql.internal.ast org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
。 QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
处org.hibernate.engine.query.spi org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
。 HQLQueryPlan。< init>(HQLQueryPlan.java:126)
at org.hibernate.engine.query.spi.HQLQueryPlan。< init>(HQLQueryPlan.java:88)
at org.hibernate。 engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:1 90)
。在org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
。在org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
。在有机.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)$ Utilities.test.readXrefRule
(test.java:67)$ Utilities.test.main
$(test.java:171)
org.hibernate.hql.internal.ast.QuerySyntaxException:with-clause引用
两个不同于子句元素[select t.id,t.name,t.src_field_map.id,
s1 .field_map_nm如src_field_map_nm,t.tgt_field_map.id,s2.field_map_nm
作为tgt_field_map_nm,orm.entity.OS_Rule为t左加入t.src_field_map
为S1左连接t.tgt_field_map为S2与(S1。 id = t.src_field_map.id
和s2.id = t.tgt_field_map.id)]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
在org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
在o rg.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:284)
在org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
。在org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)LT
。在org.hibernate.engine.query.spi.HQLQueryPlan&;初始化>(HQLQueryPlan.java:126)
。在org.hibernate.engine.query.spi.HQLQueryPlan<初始化>(HQLQueryPlan.java:88)
。在org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190 )维持在org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
。在组织
。 hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)$ Utilities.test.readRule(test.java:67)
Utilities.test.main($ test.java:171)


解决方案

试试这个:

  select 
t.id,
t.name,
s1.id,
s1.field_map_nm as src_field_map_nm,
s2.id,
s2.field_map_nm作为tgt_field_map_nm
从Rule作为t
离开连接t.src_field_map作为s1
离开连接t.tgt_field_map作为s2

我认为你不需要带子句的



您的子句实际上是两次引用同一个表id :

  s1.id = t.src_field_map.id 

因为 s1 = t.src_field_map



子句翻译为:

  t.src_field_map.id = t.src_field_map.id 

因此,您可以使用子句删除


I am getting started with Hibernate and I am using HQL, using some joins to retrieve data from the db but getting this error, any help on how to solve this is appreciated.

Field.hbm.xml file:

    <id name="id" type="string">
        <column name="field_map_cd" />
        <generator class="assigned"></generator>
    </id>

Rule.hbm.xml file:

    <many-to-one name="src_field_map" column="field_map_cd" not-null="true" insert="false" update="false"/>
    <many-to-one name="tgt_field_map" column="field_map_cd" not-null="true" insert="false" update="false"/>

HQL query:

select t.id, t.name, t.src_field_map.id, s1.field_map_nm as src_field_map_nm, 
t.tgt_field_map.id,s2.field_map_nm as tgt_field_map_nm from Rule as t 
left join t.src_field_map as s1 left join t.tgt_field_map as s2 
with (s1.id = t.src_field_map.id and s2.id = t.tgt_field_map.id)

Stacktrace:

ERROR:  with-clause referenced two different from-clause elements
with-clause referenced two different from-clause elements
at org.hibernate.hql.internal.ast.HqlSqlWalker.handleWithFragment(HqlSqlWalker.java:465)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:413)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3858)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3644)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3522)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)
at Utilities.test.readXrefRule(test.java:67)
at Utilities.test.main(test.java:171)
org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause referenced 
two different from-clause elements [select t.id, t.name, t.src_field_map.id,
s1.field_map_nm as src_field_map_nm,t.tgt_field_map.id, s2.field_map_nm
as tgt_field_map_nm, orm.entity.OS_Rule as t left join t.src_field_map
as s1 left join t.tgt_field_map as s2 with (s1.id = t.src_field_map.id 
and s2.id = t.tgt_field_map.id )]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:284)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)
at Utilities.test.readRule(test.java:67)
at Utilities.test.main(test.java:171)

解决方案

Try this:

select 
    t.id, 
    t.name, 
    s1.id, 
    s1.field_map_nm as src_field_map_nm, 
    s2.id,
    s2.field_map_nm as tgt_field_map_nm
from Rule as t 
left join t.src_field_map as s1 
left join t.tgt_field_map as s2

I think you don't need the with clause since you only use the FK, which is implicit anyway.

Your with clause is actually referencing the same table id twice:

s1.id = t.src_field_map.id

since s1 = t.src_field_map

So your with clause translates to:

t.src_field_map.id = t.src_field_map.id

So, you can just remove the with clause.

这篇关于HQL错误:with-clause引用了两个不同的从句元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆