2

Java 1.6、Hibernate 3.1、MySQL 5.5、XML マッピングを使用しています。partner と partner_http_account の 2 つのテーブルがあります。関連するフィールドのみを示します。

相棒:

partnerid dec(22,0) [primary key]

パートナー_http_アカウント:

partnerhttpacctid dec(22,0) [primary key]
partnerid dec(22,0) [foreign key]

XML マッピングは次のとおりです。

<class name="com.rc.model.partner.Partner" table="partner" mutable="true">
    <id name="partnerId" type="int">
        <column name="partnerid" scale="10" precision="0" not-null="true" unique="true" sql-type="int unsigned"/>
        <generator class="com.rc.model.jdbc.sequence.MexpIdentifierGenerator">
            <param name="sequence">seq_partnerid</param>
            <param name="idDataType">int</param>
        </generator>
    </id>
    ...
    <one-to-one name="partnerHTTPAccount" class="com.rc.model.partner.PartnerHTTPAccount" lazy="false"
                 foreign-key="partnerid" cascade="all"/>
</class>

<class name="com.rc.model.partner.PartnerHTTPAccount" table="partner_http_account">
    <id name="partnerHttpAcctId" type="int">
        <column name="partnerhttpacctid" scale="10" precision="0" not-null="true" unique="true" sql-type="int unsigned"/>
        <generator class="com.rc.model.jdbc.sequence.MexpIdentifierGenerator">
            <param name="sequence">seq_partnerhttpacctid</param>
            <param name="idDataType">int</param>
        </generator>
    </id>

    <many-to-one name="partner" class="com.rc.model.partner.Partner" column="partnerid"
                 foreign-key="partnerid" cascade="none"/>
</class>

ここに私のJavaコードがあります:

public List<Partner> getPartnersByDomainStartsWith(String domainStartsWith) {

    Query hQuery = sessionManager.getSession().createQuery("from Partner p " +
            "left outer join fetch p.partnerHTTPAccount " +
            "where p.domain like :domainStartsWith||'%'");

    hQuery.setString("domainStartsWith", domainStartsWith);

    return hQuery.list();
}

そして、Hibernate が生成するものは次のとおりです。

select partner0_.partnerid as partnerid0_,
partnerhtt1_.partnerhttpacctid as partnerh1_1_,
...
partnerhtt1_.partnerid as partnerid104_1_,
...
from partner partner0_
left outer join partner_http_account partnerhtt1_ on partner0_.partnerid=partnerhtt1_.partnerhttpacctid 
where partner0_.domain like concat(?, '%')

私の問題は、これら 2 つのテーブルの生成された SQL クエリが間違ったフィールドに結合していることです。partner0.partnerid=partnerhtt1.partnerid代わりに参加する必要があります。いくつかの洞察を本当に感謝します。ありがとう。

4

1 に答える 1

0

これは、Hibernateのドキュメントで非常によく説明されています:

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <many-to-one name="address" 
        column="addressId" 
        unique="true"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
   <one-to-one name="person" 
        property-ref="address"/>
</class>

1 対 1 が address プロパティによってマッピングされた関連付けの逆側であることを示すために、property-ref がどのように使用されているかに注目してください。

于 2012-06-11T19:32:12.097 に答える