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多対 1 の関係を定義しており、複合外部キーの列を示しています。RoleCompanyPerson

テーブルには、CompanyPerson テーブルの主キーに対する外部キーを持つ 2 つの列 (会社番号と従業員 ID で構成されていると予想されます) がありますRoleCOMPANY_NUMBEREMPLOYEE_ID

ハイバネートがRoleテーブル内の行を選択する必要があり、フェッチ タイプが の場合EAGER、次のように生成されますSELECT

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

次に、テーブルSELECT内の関連する行ごとに 1 つずつ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これが注釈を理解するのに役立つことを願っています。

于 2013-07-02T10:47:10.957 に答える