with-clause 在 hSQL 中引用了两个不同的 from-clause 元素

Posted

技术标签:

【中文标题】with-clause 在 hSQL 中引用了两个不同的 from-clause 元素【英文标题】:with-clause referenced two different from-clause elements in hSQL 【发布时间】:2015-03-13 12:24:33 【问题描述】:

获取异常:

With-clause 引用了两个不同的 from-clause 元素

使用以下实体执行以下查询时:

@Entity
public class A 

    @Id
    private Long id;

    @Column(name = "A_ID")
    private Long aId;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "A_ID")
    private B b;


@Entity
public class B 

    @Id
    private Long id;

    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    @JoinColumn(name="C_ID" , referencedColumnName="ID")
    private List<C> c;


@Entity
public class C 

    @Id
    private Long id;

    @Column(name="C_ID")
    private Long cId;

    @Column
    private String addType;

我的 HQL 查询是:

SELECT * FROM A a 
INNER JOIN a.b b ON a.aId=b.id 
LEFT OUTER JOIN b.c c ON b.id=c.cId AND c.addType='PermanentAddress' 
LEFT OUTER JOIN b.c d ON b.id=d.cId AND d.addType='ResidentialAddress'
LEFT OUTER JOIN b.c e ON b.id=e.cId AND e.addType='OfficeAddress'
WHERE a.id  =:id

我得到的例外是:

原因:org.hibernate.hql.internal.ast.QuerySyntaxException:with-clause 引用了两个不同的 from-clause 元素 在 org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:284) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:126) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:88) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800) ~[hibernate-core-4.3.6.Final.jar:4.3.6.Final] 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final] ...省略了187个常用框架

【问题讨论】:

【参考方案1】:

您的查询中不需要 ON 子句。 Hibernate 会自动链接模型。

【讨论】:

帮助过类似的案例,只是将on 替换为where。谢谢。 @attofi all on with "where" ?【参考方案2】:

您不需要查询中的 ON 子句和条件,因为您只使用 FK,这无论如何都是隐式的。

试试这个:

SELECT * 
FROM A a
INNER JOIN a.b b
LEFT OUTER JOIN b.c c WITH c.addType='PermanentAddress' 
LEFT OUTER JOIN b.c d WITH d.addType='ResidentialAddress'
LEFT OUTER JOIN b.c e WITH e.addType='OfficeAddress'
WHERE a.id  =:id

【讨论】:

以上是关于with-clause 在 hSQL 中引用了两个不同的 from-clause 元素的主要内容,如果未能解决你的问题,请参考以下文章

两个实体管理器的 HSQL 死锁

如何从脚本文件创建 HSQL in-memory-db?

HSQL 中的 GenericJDBCException

Spring:HSQL-无法执行数据库脚本

HSQL 列名包含 #

HSQL 在 Spring 引导测试中不起作用