java - HQL 错误 : with-clause referenced two different from-clause elements

标签 java hibernate jpa orm hql

我开始使用 Hibernate 并且我正在使用 HQL,使用一些连接从数据库中检索数据但是出现此错误,感谢任何有关如何解决此问题的帮助。

Field.hbm.xml 文件:

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

Rule.hbm.xml 文件:

    <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 查询:

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)

堆栈跟踪:

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)

最佳答案

试试这个:

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

我认为您不需要 with 子句,因为您只使用 FK,无论如何它都是隐式的。

您的 with 子句实际上引用了同一个表 ID 两次:

s1.id = t.src_field_map.id

因为 s1 = t.src_field_map

所以你的 with 子句翻译成:

t.src_field_map.id = t.src_field_map.id

因此,您只需删除 with 子句即可。

关于java - HQL 错误 : with-clause referenced two different from-clause elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23835442/

相关文章:

java - 转义 unicode 代理字符?

java - 如何在 Android Retrofit api 中为每个 api 使用 OkHttp 拦截器获取 api 请求和 api 响应时间?

Java - HtmlUnit - 无法将 HTML 保存到文件(在某些情况下)

spring - 具有字符串ID的映射域

database - JPA/Hibernate区别MappedSuperclass和实体抽象类

java - @OneToMany 关联加入错误的字段

java - WildFly9.0 - 添加Web服务访问

hibernate - JPA/Hibernate 中的条件/复合 JoinColumn

JPA 标准 JOIN 等 ON

java - Hibernate 使用 MySQL 生成无效的 SQL 查询