Java 为什么Hibernate生成的查询连接到错误的列?
我正在使用Java1.6、Hibernate3.1、MySQL 5.5和XML映射。我有两个表,partner和partner\u http\u account。我将向您展示相关字段 合作伙伴:Java 为什么Hibernate生成的查询连接到错误的列?,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我正在使用Java1.6、Hibernate3.1、MySQL 5.5和XML映射。我有两个表,partner和partner\u http\u account。我将向您展示相关字段 合作伙伴: partnerid dec(22,0) [primary key] 合作伙伴\u http\u帐户: partnerhttpacctid dec(22,0) [primary key] partnerid dec(22,0) [foreign key] 以下是XML映射: <class nam
partnerid dec(22,0) [primary key]
合作伙伴\u http\u帐户:
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>
我的问题是这两个表生成的sql查询在错误的字段上连接。它应该在partner0.partnerid=partnerhtt1.partnerid上加入。我真的很想了解一些情况。谢谢。这在以下内容中有很好的描述:
请注意如何使用property ref来表示一对一是address属性映射的关联的反方向。这在以下内容中有很好的描述:
请注意如何使用property ref来表示一对一是address属性映射的关联的反方向。我不知道这是否是问题所在,但您是否意识到,从一个方向上看,您有一对一的关系,从另一个方向上看,您有多对一的关系?我不知道这是否是问题所在,但是你有没有意识到,从一方你有一对一的关系,从另一方你有多对一的关系?不,恰恰相反。Person包含联接列addressId,它是地址表的外键。PartnerHTTPAccount也是如此,它包含连接列partnerId,它是Partner表的外键。好的!这很有效。谢谢我不得不说,我不认为hibernate文档中有什么描述得很好-至少我在他们的示例中找不到任何与我遇到麻烦时的情况相符的东西-但我感谢你为我翻译。不,恰恰相反。Person包含联接列addressId,它是地址表的外键。PartnerHTTPAccount也是如此,它包含连接列partnerId,它是Partner表的外键。好的!这很有效。谢谢我不得不说,我不认为hibernate文档中有什么描述得很好——至少在他们的示例中,我从来没有发现任何东西能够反映我遇到麻烦时的情况——但我感谢你为我翻译。
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();
}
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(?, '%')
<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>