如何在HQL中使用select语句,它将返回所有行而不管null值

时间:2012-01-19 22:01:27

标签: xml hibernate hql

我有一个包含一对一映射的对象。

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。

我做错了什么?

1 个答案:

答案 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