Hibernate的@JoinColumns生成什么SQL?

时间:2013-07-02 08:14:36

标签: hibernate jpa

我正在尝试分析遗留应用程序,并且我在名为Role.java的类中获得了此批注。我正在尝试找出为此特定连接生成的SQL的外观。

@ManyToOne
@JoinColumns({
@JoinColumn(name="COMPANY_NUMBER", referencedColumnName="COMPANY_NUMBER", insertable=false, updatable=false),
@JoinColumn(name="EMPLOYEE_ID", referencedColumnName="EMPLOYEE_ID", insertable=false, updatable=false)
})
private CompanyPerson person;

我猜它会使用别名,类似这样的

LEFT JOIN person_role ROLEA 
    ON ROLEA.employee_id = PERSON.employee_id
LEFT JOIN person_role ROLEB
    ON ROLEB.company_number = PERSON.company_number;

但是我不确定,我只有源代码继续 - 无法构建应用程序,我无法靠近服务器来完成日志记录,以便让Hibernate记录SQL。还快速浏览了JPA spec,但无法弄明白。

有人能举例说明生成的SQL的外观吗?

由于

1 个答案:

答案 0 :(得分:1)

@JoinColumns注释定义了RoleCompanyPerson表之间的多对一关系,表示复合外键的列。

Role表中,您会找到2列COMPANY_NUMBEREMPLOYEE_ID,其中包含针对CompanyPerson表主键的外键(预计由公司编号组成)和员工身份。)

当hibernate必须选择Role表中的行时,如果获取类型为EAGER,则会生成以下SELECT

select
    role0_.id as id17_,
    role0_.COMPANY_NUMBER as COMPANY2_17_,
    role0_.EMPLOYEE_ID as EMPLOYEE3_17_
from Role role0_

然后为SELECT表中的每个相关行添加一个CompanyPerson,传递为COMPANY_NUMBEREMPLOYEE_ID字段返回的第一个查询的值:

select
    companyper0_.COMPANY_NUMBER as COMPANY1_18_0_,
    companyper0_.EMPLOYEE_ID as EMPLOYEE2_18_0_,
    companyper0_.information as informat3_18_0_
from CompanyPerson companyper0_
where companyper0_.COMPANY_NUMBER=? and companyper0_.EMPLOYEE_ID=?

如果您强制联接以避免N + 1查询,使用获取联接,您将获得以下选择:

select
    role0_.id as id17_0_,
    companyper1_.COMPANY_NUMBER as COMPANY1_18_1_,
    companyper1_.EMPLOYEE_ID as EMPLOYEE2_18_1_,
    role0_.COMPANY_NUMBER as COMPANY2_17_0_,
    role0_.EMPLOYEE_ID as EMPLOYEE3_17_0_,
    companyper1_.information as informat3_18_1_
from Role role0_
    inner join CompanyPerson companyper1_
        on role0_.COMPANY_NUMBER=companyper1_.COMPANY_NUMBER and role0_.EMPLOYEE_ID=companyper1_.EMPLOYEE_ID

您应该执行类似以下代码的操作来生成此查询:

List<Role> roles = (List<Role>)session.createQuery(
        "from Role role join fetch role.person person").list();

我希望这可以帮助您理解@JoinColumns注释。