当我在hql

时间:2017-04-28 04:52:30

标签: hibernate join

我有以下HQL

String FIND_PRODUCT_CLASS_ID = "SELECT pc.id FROM ProductClass pc"+ 
" JOIN ProductGroup pg ON pc.id = pg.productClassId" +
" JOIN Product p ON pg.id = p.id" +
" JOIN ProductSub ps ON p.id = ps.productId WHERE ps.id =:childProductSubId";

当我在Spring Hibernate环境中运行此查询时,我得到以下堆栈跟踪。

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [SELECT pc.id FROM com.xxx.domain.ProductClass pc JOIN ProductGroup pg ON pc.id = pg.productClassId JOIN Product p ON pg.id = p.id JOIN ProductSub ps ON p.id = ps.productId WHERE ps.id =:childProductSubId]
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:167)
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 org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)
... 146 more

但是,如果我修改了下面没有join关键字的查询,则会成功。

String FIND_PRODUCT_CLASS_ID = "SELECT pc.id FROM ProductClass pc, ProductGroup pg, " +
 " Product p, ProductSub ps where pc.id = pg.productClassId "+
 " and pg.id = p.id and p.id = ps.productId and ps.id =:childProductSubId";

我知道我已经找到了解决方案,但我不确定为什么它不适用于HQL中的join关键字。请给我这个sombody解释一下吗?这与映射有关吗?在我的例子中,对象在Hibernate层中映射。

3 个答案:

答案 0 :(得分:7)

我们需要在HQL查询中提供路径。 这是&#34;路径预期的加入&#34;例外即将来临。

更改如下所示的查询:请按使用情况进行编辑

String FIND_PRODUCT_CLASS_ID = "SELECT pc.id FROM ProductClass pc"+ 
" JOIN pc.ProductGroup pg " +
" JOIN pg.Product p " +
" JOIN p.ProductSub ps WHERE ps.id =:childProductSubId";'

请参阅this

答案 1 :(得分:0)

从Hibernate 5.1开始,您可以使用SQL之类的语法联接来联接不相关的实体。

如果仍然出现 antlr.SemanticException: Path expected for join! 错误 您可能必须使用完整的类名,包括软件包。

String FIND_PRODUCT_CLASS_ID = "SELECT pc.id FROM ProductClass pc"+ 
" JOIN com.mypackage.ProductGroup pg ON pc.id = pg.productClassId" +
" JOIN com.mypackage.Product p ON pg.id = p.id" +
" JOIN com.mypackage.ProductSub ps ON p.id = ps.productId WHERE ps.id =:childProductSubId";

答案 2 :(得分:0)

你可能必须做这样的事情。然后你可以使用 user.Address ad 加入,并使用 ad 引用 Address 声明的变量。

@Entity
@Table(name = "users")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    private Address address;

}