没有直接连接的Hibernate连接查询

Hibernate join query without direct connection

我有以下实体 class

public class Customer {
    @Id
    private int id;
    @Column(name = "CID")
    private String cid;
}


public class Alccs {
    @Id
    private int vid;
//    @Column(name = "CID")
//    private String cid;

    @ManyToOne
    @JoinColumn(name = "CID", referencedColumnName = "CID")
    private Customer customer;
}


public class Rtwo {
    @Id
    private int jobNo;

    @ManyToOne
    @JoinColumn(name = "CID", referencedColumnName = "CID")
    private Customer customer;
}




public class RTwoCycle {
    @Id
    private int cycleJobNo;
    @Column
    private int vid;

    @ManyToOne
    @JoinColumn(name = "JobNo", referencedColumnName = "JobNo")
    private TblRtwo tblRtwo;

}

如何使用 HQLcriteria

编写如下查询

select top 20 * from RTwoCycle rtCycle join Alccs al on rtCycle.vid = al.vid;

对于 HQL,我尝试了以下方法

from TBLRTwoCycle rtCycle join TBLAL al on rtCycle.vid = al.vid

但收到 QuerySyntaxException: Path expected for join! 错误

关于标准我不知道该怎么做

如何做到这一点??

早于 5.1 的 JPA 和 Hibernate 版本需要定义的关系才能在 JPQL 查询中连接两个实体。这通常会导致级联 JOIN 语句遍历实体之间的关系图,或声明如果实体之间没有关系,则 JPQL 无法实现实体的 JOIN。

Hibernate 5.1 引入了对不相关实体的显式连接。语法与 SQL 非常相似,允许您在 ON 语句中定义 JOIN 条件。

More Info

  1. from RTwoCycle as rtCycle inner join Alccs as al with rtCycle.vid = al.vid

对于 HQL 简单的连接和 on clause 就足够了

from table1 as t1 inner join table2 as t2 on t1.vid=t2.vid

from table1 as t1, table2 as t2 where t1.vid=t2.vid

标准Restriction.sqlRestriction是这个问题的解决方案

session.createCriteria(Class1,"c1")
        .createAlias("class2", "c2")
        .add(Restrictions.sqlRestriction("c1.vid=c2.vid")