1

我正在尝试分析一个遗留应用程序,并且我在一个名为 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 规范,但无法弄清楚。

有人可以给我一个生成的 SQL 的示例吗?

谢谢

4

1 回答 1

1

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

在您的Role表中,您会发现 2 列COMPANY_NUMBEREMPLOYEE_ID,外键与 CompanyPerson 表的主键(预计由公司编号和员工 ID 组成)。

当 hibernate 必须选择Role表中的行时,如果 fetch type 是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_NUMBERandEMPLOYEE_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 个查询,则使用 fetch join,您将获得以下选择:

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注释。

于 2013-07-02T10:47:10.957 回答