我有一个包含一对一映射的对象。
Customer.hbm.xml:
<class name="com.asi.shared.Customer" table="Customer">
<id name="id" column="CustomerID">
<generator class="assigned"/>
</id>
<property name="customerName" column="CustomerName" />
...
<one-to-one name="corp" class="com.asi.shared.Corp"/>
</class>
Corp.hbm.xml
<class name="com.asi.shared.Corp" table="Corp">
<id name="id" column="CustomerID">
<generator class="assigned"/>
</id>
<property name="customerName" column="CustomerName" />
<property name="storeNumber" column="StoreNumber"/>
<property name="corpCustomerId" column="CorpCustomerId"/>
</class>
我想运行以下查询并返回costumer表中的所有行。
select customerName, id, support, corp.corpCustomerId
from com.asi.shared.Customer ORDER BY customerName
但是,它只返回在corp表中包含某些内容的行。不是每个客户都会在corp表中有东西,我不介意让corp.corpCustomerId = null。
我做错了什么?
答案 0 :(得分:1)
当你选择customer.corp.corpCustomerId
时,你隐含地在两个表之间进行内连接,而你想要的是左连接。按原样重写您的查询:
select customer.customerName, customer.id, corp.corpCustomerId
from Customer customer
left join customer.corp corp
order by customer.customerName
旁注:如果您在属性名称中没有所有这些重新授权,那么您的代码将更具可读性。无需调用属性customerName。它是Customer类的属性,因此customer.name
就足够了。 corp.corpCustomerId
的内容相同,更容易理解为corp.customerId
。