我正在尝试分析遗留应用程序,并且我在名为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的外观吗?
由于
答案 0 :(得分:1)
@JoinColumns
注释定义了Role
和CompanyPerson
表之间的多对一关系,表示复合外键的列。
在Role
表中,您会找到2列COMPANY_NUMBER
和EMPLOYEE_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_NUMBER
和EMPLOYEE_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
注释。