[英]Why is Hibernate generating a query that joins on the wrong column?
I'm using Java 1.6, Hibernate 3.1, MySQL 5.5, XML mapping. 我正在使用Java 1.6,Hibernate 3.1,MySQL 5.5,XML映射。 I have two tables, partner and partner_http_account.
我有两个表,partner和partner_http_account。 I'll just show you the relevant fields.
我只向您显示相关字段。
partner: 伙伴:
partnerid dec(22,0) [primary key]
partner_http_account: partner_http_account:
partnerhttpacctid dec(22,0) [primary key]
partnerid dec(22,0) [foreign key]
Here's the XML mapping: 这是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>
Here is my Java code: 这是我的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();
}
And here is what Hibernate is generating: 这是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(?, '%')
My problem is the generated sql query of these two tables is joining on the wrong field. 我的问题是这两个表的生成的sql查询联接在错误的字段上。 It should join on
partner0.partnerid=partnerhtt1.partnerid
instead. 它应该加入
partner0.partnerid=partnerhtt1.partnerid
。 Would really appreciate some insight. 真的很感谢一些见识。 Thanks.
谢谢。
This is really well described in the Hibernate documentation : 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>
Notice how property-ref is used, to indicate that the one-to-one is the inverse side of the association mapped by the address property. 请注意如何使用property-ref来指示一对一是由address属性映射的关联的反面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.